歸併排序的主要思想就是將一個待排序列,①不斷地一分爲二劃分紅一個元素組成序列,一個元素組成的序列也就是有序序列,②而後再合併將相鄰的兩個有序序列,最終待排序列變成一個有序序列。
總之,歸併算法就是採用了分治+遞歸的思想,先遞歸分解數列,而後再合併數列。算法
以待排序列3,2,5,6,4,7,1爲例數組
將此序列一分爲二
①:3,2,5 和 6,4,7,1
而後將①左邊序列3,2,5一分爲二3d
②:3 和 2,5
繼續劃分②左邊序列,由於只有一個元素3,因此3已是有序序列,返回到②將右邊序列一分爲二code
③:2 和 5
由於③的左邊和右邊序列均只有一個元素因此都是有序序列,就能夠進行左右相鄰序列的合併操做,此時合併後的序列爲2,5。而後,返回到②合併序列3和2,5爲有序序列2,3,5blog
而後返回到①,將①右邊的序列一分爲二排序
④:6,4 和 7,1
將④的左邊繼續一分爲二遞歸
⑤:6 和 4
由於⑤的左右兩邊序列均爲一個元素,也就是都是有序的,那麼就將這兩個相鄰序列進行合併,合併後的序列爲4,6,返回到④,將④右邊的序列進行一分爲二ast
⑥:7 和 1
由於⑥的左右兩邊序列均爲一個元素,因此都是有序序列,將這兩個序列合併,合併後爲1,7
而後回到④,合併④的左右兩邊有序序列4,6和1,7,合併後爲1,4,6,7class
最後回到①,如今①的左右兩邊均爲有序序列,2,3,5 和 1,4,6,7,合併這兩個序列,合併後就爲1,2,3,4,5,6,7 im
對應上述文字分析,附圖一張,可對照理解
根據描述,將代碼實現就可分爲如下兩部分:
//要從新開闢空間存儲排好序的數據 bool MergeSort(int a[],int n) { int * temp = new int[n]; if(NULL == temp) return false; mergesort(a,0,n-1,temp); delete[] temp; return true; } void mergesort(int a[],int first,int last,int temp[]) { if(first<last) { int mid = (first+last)/2;//將一個數組一分爲二 mergesort(a,first,mid,temp);//左邊有序 mergesort(a,mid+1,last,temp);//右邊有序 mergearray(a,first,mid,last,temp);//合併兩個數組 } }
//將一個數組一分爲二看作兩個數組,將有二個有序數列a[first...mid]和a[mid...last]合併。 void mergearray(int a[],int first,int mid,int last,int temp[]) { int i = first,j = mid+1; int n = mid, m = last; int k = 0; while(i<=n && j<=m) { if(a[i]<a[j]) temp[k++] = a[i++]; else temp[k++] = a[j++]; } while(i <= n) temp[k++] = a[i++]; while(j <= m) temp[k++] = a[j++]; for(i=0;i<k;i++)//將排好序的值賦給原數組 a[first+i] = temp[i]; }