思想:
1. 基于分治法
2. 将待排序序列每次进行两两划分
3. 将划分好的序列进行两两合并,并且在合并的过程中进行排序r
性能
1. 时间复杂度:
* merge函数中递归是一个完全二叉树:log2n
* 里面还有一个合并的while循环n
* 时间复杂度 = O(nlogn)
2. 空间复杂度
* 与原始记录序列同样数量的存储空间存放归并结果
* 递归时深度为logcn的栈空间
* 空间复杂度:O(n+logn)
3. 稳定性:
* 需要两两比较,不存在跳跃
* 稳定
代码
void mergeSort(int a[],int l,int r,int m){
int L1 = m-l+1;
int R1 = r-m;
int L[L1];
int R[R1];
for (int i = 0; i<L1; i++) {
L[i] = a[l+i];
}
for (int j = 0; j<R1; j++) {
R[j] = a[m+j+1];
}
int k = l;
int i = 0;
int j = 0;
while (i<L1 &&j<R1) {
if (L[i]<R[j]) {
a[k++] = L[i++];
}
else{
a[k++] = R[j++];
}
}
while (i<L1) {
a[k++] = L[i++];
}
while (j<R1) {
a[k++] = R[j++];
}
}
void merge(int a[],int l,int r){
if (l<r) {
int m = (l+r)/2;
merge(a, l, m);
merge(a, m+1, r);
mergeSort(a, l, r, m);
}
}