1、概念
歸併排序(Merging Sort):將兩個(或兩個以上)有序表合併成一個新的有序表,即把待排序序列分爲若干個子序列,每個子序列是有序的。然後再把有序子序列合併爲整體有序序列。
2、算法實現
第一步:申請空間,使其大小爲兩個已經排序序列之和,該空間用來存放合併後的序列;
第二步:設定兩個指針,最初位置分別爲兩個已經排序序列的起始位置;
第三步:比較兩個指針所指向的元素,選擇相對小的元素放入到合併空間,並移動指針到下一位置;
重複步驟3直到某一指針達到序列尾
將另一序列剩下的所有元素直接複製到合併序列尾
3、code
/*將SR[s…t]歸併排序爲TR1[s…t]*/ void MSort(int SR[],TR1[],int s,int t) { int m; int TR2[MAXSIZE+1]; if(s==t) TR1[s]=SR[s]; else { m=(s+t)/2; /*將SR[s…m]和SR[m+1…t]*/ MSort(SR,TR2,s,m); MSort(SR,TR2,m+1,t); Merge(TR2,TR1,s,m,t); /*將TR2[s…m]和TR2[m+1…t]歸併到TR1[s…t]*/ } } /*將有序的SR[i…m]和SR[m+1…n]歸併爲有序的TR[i…n]*/ void Merge(int SR[],int TR[],int i,int m,int n) { int j,k,l; for(j=m+1,k=i;i<=m&&j<=n;k++) /*將SR中記錄由小到大歸併入TR*/ { if(SR[i]<SR[j]) TR[k]=SR[i++]; else TR[k]=SR[j++]; } if(i<=m) /*說明SR[i…m]沒有完全歸併到TR而SR[m+1…n]已經全部歸併到SR*/ { for(l=0;l<=m-i;l++) TR[k+1]=SR[i+1]; /*將剩餘的SR[i…m]複製到TR*/ } if(j<=n) /*說明SR[m+1…n]沒有完全歸併到TR而SR[i…m]已經全部歸併到SR*/ { for(l=0;l<=n-j;l++) TR[k+1]=SR[j+1]; /*將剩餘的SR[m+1…n]複製到TR*/ } }