概述
接下说说归并排序,和快排一样是分治的思想,个人觉得代码核心的merge合并算法实现起来要比快排的partition稍微简单点。
这里比较一下归并和快排的不同点:
1、两种排序都是自顶向下,但是归并排序是递归到底才开始排序(从最小规模开始),逐步合并为整个有序数组。
2、快排是不稳定排序,归并是稳定但是需要额外的辅助空间aux[n],理论上稳定并且不需要辅助空间的排序只有堆排序。
代码
这里的merge是将a[]归并到aux[],再拷贝回a[]中去。另外也可以先拷贝到aux[],再归并回a[]。
void merge(int a[], int lo, int mid, int hi, int* aux){
int i = lo;
int j = mid + 1;
int k = lo;
//[(lo\i).....sorted array.....mid|j.....sorted array.....hi] ==> [k..............]
while(k <= hi){
//控制流中最好不要把前连个分支当成后两个分支的前置条件,后两个分支显示声明出来比较好
if (i > mid) { aux[k++] = a[j++]; }
else if (j > hi) { aux[k++] = a[i++]; }
else if (a[i] < a[j]) { aux[k++] = a[i++]; }
else if (a[i] >= a[j]) { aux[k++] = a[j++]; }
}
for(int i = lo; i <= hi; i++){
a[i] = aux[i];
}
}
void sort(int a[], int lo, int hi, int* aux){
if (lo >= hi)
return;
int mid = (lo + hi) / 2;
sort(a, lo, mid, aux);
sort(a, mid + 1, hi, aux);
merge(a, lo, mid, hi, aux);
}
void MergeSort(int a[], int n) {
int *aux = new int[n];
memset(aux, 0, n);
sort(a, 0, n - 1, aux);
}
1945

被折叠的 条评论
为什么被折叠?



