Live2d

算法之归并排序分析

算法描述


基本思想:合并排序法是将两个或以上的有序表合成一个新的有序表,把待排序数组分为各个子序列,当把每一个子序列都进行排序后再把子序列合并成一个有序整体。

自上而下的递归(设有n个元素):

  1. 将序列每相邻两个数字进行归并操作,形成 floor(n/2)个序列,排序后每个序列包含两个元素;
  2. 将上述序列再次归并,形成 floor(n/4)个序列,每个序列包含四个元素;
  3. 重复步骤2,直到所有元素排序完毕。

 

核心代码及注释如下:

//归并排序

 

private static void merge(Comparable[] a, Comparable[] aux, int lo, int mid, int hi) {
// precondition: a[lo .. mid] and a[mid+1 .. hi] are sorted subarrays
assert isSorted(a, lo, mid);     //将左右俩边分别递归排序,并检测是否排序完成
assert isSorted(a, mid+1, hi);      //将左右俩边分别递归排序,并检测是否排序完成

 

// copy to aux[]
for (int k = lo; k <= hi; k++) { 对数组进行拷贝
aux[k] = a[k];
}

 

// merge back to a[]
int i = lo, j = mid+1;
for (int k = lo; k <= hi; k++) {
if (i > mid) a[k] = aux[j++]; //当一边牌序完成后对数组就行合并。
else if (j > hi) a[k] = aux[i++];
else if (less(aux[j], aux[i])) a[k] = aux[j++];
else a[k] = aux[i++];
}

 

// postcondition: a[lo .. hi] is sorted
assert isSorted(a, lo, hi);
}


分析:

归并排序是较为稳定的排序方法。

时间复杂度为:O(nlogn),速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。

 

posted @ 2021-03-10 21:38  IkNyEa  阅读(72)  评论(0)    收藏  举报