排序算法----歸併排序

歸併排序徹底遵循分治模式,主要操做分爲三步:數組

1.分解:分解待排序的n個元素序列爲2個n/2個元素的子序列。ide

2.解決:使用歸併排序遞歸的排序兩個子序列。spa

3.合併:合併兩個已排序的子序列。code

最重要的步驟就是合併2個已經排序的序列。例如:A和B都是從小到大排序的序列。依次對比A的第一個元素和B的第一個元素,把其中較小的元素出序列,插入到C中,直到兩個序列中的元素都爲空。最後,C序列就是一個包含A序列和B序列且從小到排序的序列。blog

 僞碼:    排序

 1 Merge(A,p,q,r)
 2      n1 = q - p + 1
 3      n2 = r - q
 4      let L[1..n1 + 1]  and R[1.. n2 + 1] be new arrays
 5      for i = 1 to n1
 6           L[i] = A[p + i - 1]
 7      for j = 1 to n2
 8           R[i] = A[q + j]
 9     L[n1 + 1] =10     R[n2 + 1] =11     i = 1
12     j = 1
13    for k = p to r
14        if L[i] <= R[j] 
15            A[k] = L[i]
16            i = i + 1
17         else
18            A[k] = R[i]
19            j = j + 1
View Code

     上述僞碼中,其中A爲待排序的數組,且A[p..q ]和A[q + 1..r]都是排序好的。9,10行中,在L,R最後插入一個值,做爲哨兵值,每當出現哨兵值時,它不可能爲較小的值,這樣能夠簡化代碼,避免檢查L或R爲空。遞歸

 圖例:event

      

 

最後咱們使用Merge_sort 排序數組A[p...r]中的元素。若p >= r,時,數組中最多隻有一個元素,因此是排序好的,程序結束;不然,分解數組A[p...r]爲兩個子數組A[p...q]和A[q + 1...r],而後合併2個子數組。class

僞碼:   cli

1 Merge_sort(A,p,r)
2    if p < r
3            q = ⌊(p + r) / 24            Merge_sort(A,p,q)
5            Merge_sort(A,q + 1,r)
6            Merge(A,p,q,r)
View Code

圖例:

    

歸併排序的時間複雜度:T(n) = O(nlgn)

C++代碼:

 1 void Merge(int a[],int p,int q,int r)
 2 {
 3     int n1 = q - p + 1;
 4     int n2 = r - q;
 5 
 6     int *L = new int[n1],*R = new int [n2];
 7     for(int i = 0;i < n1;i++)
 8     {
 9         L[i] = a[p + i];
10     }
11     for(int i = 0;i < n2;i++)
12     {
13         R[i] = a[q + i + 1];
14     }
15 
16     for(int k = p,iL = 0,iR = 0; k <= r;k++)
17     {
18         if(iL != n1 && iR == n2)
19             a[k] = *L++;
20         if(iR != n2 && iL == n1)
21             a[k] = *R++;
22 
23         if(iL != n1 && iR != n2)
24         {        
25             if(*L < *R)
26             {
27                 a[k] = *L;
28                 L++;
29                 iL++;
30             }
31             else
32             {
33                 a[k] = *R;
34                 R++;
35                 iR++;
36             }
37         }
38     }
39     delete[] (L - n1);
40     delete[] (R - n2);
41 }
42 
43 //合併排序,T(n) = O(nlgn)
44 void Merge_sort(int a[],int p,int r)
45 {
46     if(p < r)
47     {
48         int q = (p + r) / 2;
49         Merge_sort(a,p,q);
50         Merge_sort(a,q + 1,r);
51         Merge(a,p,q,r);
52     }
53 }
View Code
相關文章
相關標籤/搜索