今天來談談排序效率較高的歸併排序算法。web
思想:算法
分治 + 合併數組
具體點說就是將一個數組分紅左右兩個部分,而後將左右兩個部分的順序排好後,在合併到一塊兒!測試
那麼怎麼將左右兩個部分的順序排好呢?spa
咱們這樣看,用遞歸的思想,將左右兩個部分再次分紅各個的兩個部分,直到每一個部分的數據個數爲1。這樣咱們便獲得了有序的部分數組。指針
接着,咱們將這些數組合並。最終便會成爲有序的數組。code
看代碼:orm
1 /* 2 *歸併排序 3 *丁洋 4 */ 5 #include<stdio.h> 6 #include<stdlib.h> 7 #include<malloc.h> 8 #include<time.h> 9 /* 10 *合併數組 11 *a[first --- mid-1] 12 *a[mid+1 --- last] 13 */ 14 void mergearray(int a[], int first, int mid, int last, int temp[]) 15 { 16 int i = first; 17 int j = mid + 1; 18 int n = last; 19 int m = mid; 20 int k=0; 21 while(i <= m && j <= n){ 22 if(a[i] <= a[j]){ 23 temp[k++] = a[i++]; 24 } 25 else{ 26 temp[k++] = a[j++]; 27 } 28 } 29 while(j <= n){/*右邊還有數據*/ 30 temp[k++] = a[j++]; 31 } 32 33 while(i <= m){/*左邊還有數據*/ 34 temp[k++] = a[i++]; 35 } 36 for(i=0;i<k;i++)/*注意此處的寫法,從first開始*/ 37 a[first + i] = temp[i];/*合併排序後的數組*/ 38 } 39 /* 40 *將數組分爲A,B兩個部分 ,分治思想 41 */ 42 void merge_sort(int a[],int left,int right,int temp[]) 43 { 44 if(left < right) 45 { 46 int mid = (left + right) / 2; 47 merge_sort(a,left,mid,temp); /*A區有序*/ 48 merge_sort(a,mid + 1,right,temp); /*B區有序*/ 49 mergearray(a,left,mid,right,temp); /*合併AB區*/ 50 } 51 } 52 53 void sort(int a[],int n)/*使用一個臨時指針*/ 54 { 55 int *p; 56 p = (int *)malloc(sizeof(int) * n); 57 merge_sort(a,0,n-1,p); 58 free(p); 59 } 60 61 int main() 62 { 63 int i; 64 int a[4] = {3,1,6,2}; 65 clock_t start, finish; 66 double duration; 67 /* 測量一個事件持續的時間*/ 68 start = clock(); 69 sort(a,4); 70 for(i=0;i<4;i++) 71 printf("%d ",a[i]); 72 // sleep(500); 73 finish = clock(); 74 duration = (double)(finish - start) / CLOCKS_PER_SEC; 75 printf( "\n%f seconds\n", duration ); 76 system("pause"); 77 }
測試結果時間顯示爲0,鬱悶了,而後谷歌了一下,發現這是我時間精度的問題,在c語言中,最小也只能到毫秒級別的了。因此加上一個,sleep(500),呵呵,結果出來了,
blog
在不少的時間複雜度爲O(N*logN)的幾種排序方法(快速排序,歸併排序,希爾排序,堆排序),排序
歸併排序效率仍是較高的。
下一節談談堆排序吧!