算法之归并排序分析
算法描述
基本思想:合并排序法是将两个或以上的有序表合成一个新的有序表,把待排序数组分为各个子序列,当把每一个子序列都进行排序后再把子序列合并成一个有序整体。
自上而下的递归(设有n个元素):
- 将序列每相邻两个数字进行归并操作,形成 floor(n/2)个序列,排序后每个序列包含两个元素;
- 将上述序列再次归并,形成 floor(n/4)个序列,每个序列包含四个元素;
- 重复步骤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),速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。

浙公网安备 33010602011771号