金九银十之归并排序

92 阅读2分钟

什么是归并排序

是创建在归并操作上的一种有效的排序算法,效率为O(n*logn)(大O符号)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。

时间,空间

时间:O(n*logn)

空间:O(n)

代码实现

public static void mergeSort(int[] arr, int L, int R) {
  if (L == R) {
    return;
  }
  int mid = L + ((R - L) >> 1);
  mergeSort(arr, L, mid);
  mergeSort(arr, mid + 1, R);
  merge(arr, L, mid, R);
}

private static void merge(int[] arr, int L, int mid, int R) {
  int[] help = new int[R - L + 1];
  int i = 0;
  int p1 = L;
  int p2 = mid + 1;
  while (p1 <= mid && p2 <= R) {
    help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
  }
  while (p1 <= mid) {
    help[i++] = arr[p1++];
  }
  while (p2 <= R) {
    help[i++] = arr[p2++];
  }
  for (int i1 = 0; i1 < help.length; i1++) {
    arr[L + i1] = help[i1];
  }
}

执行过程

归并排序.2021-09-25 17_59_05.gif

是否稳定

稳定

归并排序是把序列递归地分成短序列,递归出口是短序列只有1个元素(认为直接有序)或者2个序列(1次比较和交换),然后把各个有序的段序列合并成一个有序的长序列,不断合并直到原序列全部排好序。可以发现,在1个或2个元素时,1个元素不会交换,2个元素如果大小相等也没有人故意交换,这不会破坏稳定性。那么,在短的有序序列合并的过程中,稳定是是否受到破坏?没有,合并过程中我们可以保证如果两个当前元素相等时,我们把处在前面的序列的元素保存在结果序列的前面,这样就保证了稳定性。所以,归并排序也是稳定的排序算法。