1. 首先理解归并排序的实现过程:
我想大家肯定都了解过归并排序,那些文字描述包括分治法我就不复制粘贴了,我这里以图的方式给出它的原理:
重要点:
(1):假设a数组存储待排序数组,在合并数组时避免不了改变数组内的值,所以需要一个t数组暂时保存中间结果,举个例子:在合并数组为【5,4】时,合并的结果应该是【4,5】,先将结果保存在t里面(因为中间不是简单的交换,可能还包含多个步骤),最后再用t数组中的【4,5】替换掉a数组中的【5,4】;
(2):所说的合并到底指的是什么?
合并指的是将一个数组中的两个连在一起的子数组按照原先的下标有序的组合在一起,举个例子:此时数组为5 4 3 2 1,假设现在要合并子数组为【0,0】和【1,1】,那么合并完成后就是4 5 3 2 1;
如何实现合并?(下面的代码拿着笔随便举个例子run一遍就会明白了,这也是合并排序的核心)
void Merge(int c[], int d[], int l, int m, int r){ //合并两个连续的子数组
int i = l, j = m+1, k = l ;
while ( ((i<=m) && (j<=r)) ){
if( c[i]<c[j] )
d[k++] = c[i++] ;
else
d[k++] = c[j++] ;
}
while(i<=m) //若是前半段子数组有剩余就加在总数组后面
d[k++] = c[i++];
while(j<=r) //若是后半段子数组有剩余就加在总数组后面
d[k++] = c[j++];
}
剩下的代码其实都很简单了:
先是递归程序:
void mergeSort(int a[], int left, int right){
int s ;
if(left < right){
int i = (left+right)/2 ;
mergeSort(a, left, i) ;
mergeSort(a, i+1, right) ;
Merge(a, d, left, i, right) ; //d数组是全局变量
Copy(a, d, left, right) ;
}
}
然后每当合并后执行Copy:
void Copy(int a[],int b[],int left,int right){ //将a数组的[low, right]段替换成b段的,其余保持不