对n个元素进行排序,n个元素可以看成n个长度为1的有序子数列。
两两合并,可以得到个长度为2或1的有序子数列。
再两两合并,如此反复,最终得到长度为n的有序数列。
主要函数有2个
Merge,将前后两个相邻的有序数列合并为一个有序数列。
假设在数列A中存在两段相邻的有序数列,A[low...mid], A[mid+1...high],先将它们复制到临时数组B中,然后每次从B中取出这两段有序数列的头部元素进行大小比较,将较小的放入A中,并向后移动该段有序数列的头部位置,当这两段有序数列中的其中一个头部位置已经超过了其末尾之时,将另一段有序数列剩余的部分直接复制到A余下的位置上即可。
int *B= (int *)malloc(n*sizeof(int));
void Merge(int A[],int low, int mid, int high){
for(int k=low;k<=high;k++)
B[k]=A[k]; //将A中元素全部复制到临时数组B中
for(i=low, j=mid+1,k=i;i<=mid && j<=high;k++){
if(B[i]<=B[j]) //比较临时数组B中原来两段有序数列的头部元素大小
A[k]=B[i++]; //将较小的放回A中
else
A[k]=B[j++];
}
while(i<=mid)A[k++]=B[i++]; //如果第一段数列未检测完,复制剩余部分
while(j<=high)A[k++]=B[j++]; //同理第二段
}
代码中两个while最终只会运行一个。
然后是MergeSort
void MergeSort(int A[], int low, int high){
if(low<high){
int mid=(low+high)/2; //从中划分两个子数列
MergeSort(A,low,mid); //对左侧进行递归排序
MergeSort(A,mid+1,high); //右侧同理
Merge(A,low,mid,high); //合并左右结果
}
}