經典算法系列二-歸併排序

今天來談談排序效率較高的歸併排序算法。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)的幾種排序方法(快速排序,歸併排序,希爾排序,堆排序),排序

歸併排序效率仍是較高的。

下一節談談堆排序吧!

相關文章
相關標籤/搜索