归并排序就是将两个或两个以上的有序表合并成一个有序表的过程
将两个有序表合并成一个有序表的过程称为2-路归并
算法过程如图所示:
![2](https://img2020.cnblogs.com/blog/1198974/202107/1198974-20210705192153028-2107354203.jpg)
相邻两个有序子序列的归并
void Merge(RedType R[], RedType &T[], int low, int mid, int high){
int i = low;
int j = mid + 1;
int k = low;
while(i<=mid && j<=high) {
if(R[i]<R[j]) T[k++] = R[i++];
else T[k++] = R[j++];
}
while(i<=mid) T[k++] = R[i++];
while(j<=high) T[k++] = R[j++];
}
归并排序
算法描述:
void MSort(RedType R[], RedType &T[], int low, int high) {
if(low == high) T[low] = R[low];
else {
int mid = (low + high) / 2;
RedType S[];
MSort(R, S, low, mid);
MSort(R, S, mid+1, high);
Merge(S, T, low, mid, high);
}
}
void MergeSort(SqList &L) {
MSort(L, L, 1, L.length);
}
算法分析:
时间复杂度:(O(nlog_2n))
空间复杂度:(O(n))
算法特点:
(1)是稳定排序
(2)可用于链式结构,且不需要附加存储空间,但递归实现时仍需要开辟相应的递归工作栈。