歸併排序是採用分治策略進行排序的一種算法,其基本原理是將未排序的數組劃分爲兩個子數組,分別對兩個子數組盡心排序,而後將有序的子數組合並。歸併排序分爲兩個過程:一是數組劃分爲兩個子數組並分別進行排序,二是將兩個已排序的子數組進行合併。ios
將數組劃分爲兩個子數組並進行排序算法
將數組一分爲二很簡單,關鍵是劃分以後如何排序的問題。歸併排序的作法是對數組不斷進行劃分,直到不能劃分爲止或者說不須要劃分爲止,怎樣纔算不須要再劃分呢?當子數組只剩下一個或者兩個的時候就不用繼續劃分了,一個元素原本就是有序的,兩個元素只要對比一下雙方的大小就能夠垂手可得的完成排序的工做。當兩個子數組都是有序時,將兩個字數組合併成爲一個有序的數組,而後不斷重複字數組合並的工做就能夠完成原始數組的排序。數組
以一個實例說明:對數組{13,8,15,9,5,12,11}按從小到大進行排序。spa
圖1 歸併排序示意圖3d
兩個子數組進行合併code
從上圖能夠看出,歸併排序其中一個很重要的步驟是對已經排好序的子數組進行合併。以一個實例來講明合併的步驟:blog
C++源碼排序
先給出兩個有序子數組合並的代碼:遞歸
1 void Merge(int array[],int p,int q,int r){ 2 int *temp1 = new int[q-p+1]; 3 int *temp2 = new int[r-q]; 4 for(int i=p;i<=q;i++){ 5 temp1[i-p]=array[i]; 6 } 7 for(int i=q+1;i<=r;i++){ 8 temp2[i-q-1]=array[i]; 9 } 10 int k=0; 11 int z=0; 12 for(int i=p;i<=r;i++){ 13 if((temp1[k]<temp2[z]&&k<q-p+1)||z>=r-q){ 14 array[i]=temp1[k]; 15 k++; 16 } 17 else{ 18 array[i]=temp2[z]; 19 z++; 20 } 21 } 22 }
歸併排序劃分合併實際上是一個遞歸的過程,原始數組劃分爲兩個子數組,兩個子數組再細分紅各自的子數組,直到子數組只剩下一個或者兩個元素爲止。最後將子數組逐步進行合併得出最後已排序的數組。源碼
1 void MergeSort(int array[],int p,int q,int r){ 2 if(r-p==1){ 3 if(array[p]>array[r]){ 4 swap(array,p,r); 5 } 6 return; 7 } 8 if(r-p==0){ 9 return; 10 } 11 int t=floor((p+q)/2); 12 int t1 =floor((q+1+r)/2); 13 MergeSort(array,p,floor((p+q)/2),q); 14 MergeSort(array,q+1,floor((q+1+r)/2),r); 15 Merge(array,p,q,r); 16 }
全部源代碼:
1 #include "stdafx.h" 2 #include <iostream> 3 using namespace std; 4 5 //兩個位置的數據互換 6 void swap(int array[],int num1,int num2){ 7 int temp = array[num1]; 8 array[num1]=array[num2]; 9 array[num2]=temp; 10 } 11 12 //合併有序的兩個序列 13 void Merge(int array[],int p,int q,int r){ 14 int *temp1 = new int[q-p+1]; 15 int *temp2 = new int[r-q]; 16 for(int i=p;i<=q;i++){ 17 temp1[i-p]=array[i]; 18 } 19 for(int i=q+1;i<=r;i++){ 20 temp2[i-q-1]=array[i]; 21 } 22 int k=0; 23 int z=0; 24 for(int i=p;i<=r;i++){ 25 if((temp1[k]<temp2[z]&&k<q-p+1)||z>=r-q){ 26 array[i]=temp1[k]; 27 k++; 28 } 29 else{ 30 array[i]=temp2[z]; 31 z++; 32 } 33 } 34 } 35 36 //歸併排序 37 void MergeSort(int array[],int p,int q,int r){ 38 if(r-p==1){ 39 if(array[p]>array[r]){ 40 swap(array,p,r); 41 } 42 return; 43 } 44 if(r-p==0){ 45 return; 46 } 47 int t=floor((p+q)/2); 48 int t1 =floor((q+1+r)/2); 49 MergeSort(array,p,floor((p+q)/2),q); 50 MergeSort(array,q+1,floor((q+1+r)/2),r); 51 Merge(array,p,q,r); 52 } 53 54 int main(int argc, _TCHAR* argv[]) 55 { 56 int temp[]={6,10,4,7,15,12,8,11,9,5}; 57 MergeSort(temp,0,4,9); 58 return 0; 59 }