一、定义
归并的含义是将两个或两个以上的有序表组合成一个有序表。无论是顺序存储还是链式存储都可以在O(m + n)的时间量级上实现。
2-路归并排序的核心操作是将一维数组中前后两个相邻的有序序列归并为一个有序序列。
二、实现
//归并排序-递归实现
void merge(ElementType SR[],ElementType TR[],int s,int m,int n){
int i,j,k;
for(k = i = s,j = m + 1; i <= m && j <= n;k++){
if(SR[i] <= SR[j]){
TR[k] = SR[i++];
}else{
TR[k] = SR[j++];
}
}
while(i <= m){
TR[k++] = SR[i++];
}
while(j <= n){
TR[k++] = SR[j++];
}
for(i = s; i <= n ; i++){ //保存归并后的结果
SR[i] = TR[i];
}
}
void mSort(ElementType SR[],ElementType TR[],int s,int t){
if(s == t) TR[s] = SR[s];
else{
int m = (s + t) / 2;
mSort(SR,TR,s,m);
mSort(SR,TR,m + 1, t);
merge(SR,TR,s,m,t);
}
}
void mergeSort(ElementType SR[],int n){
if(n <= 1) return;
ElementType *TR = new ElementType[n];//n个辅助空间
memset(TR,0,n);
mSort(SR,TR,0,n - 1);
delete[] TR;
TR = nullptr;
}