歸併排序

簡介:
歸併排序的時間複雜度爲O( n log n ),是一種速度僅次於快速排序的穩定排序算法。
 
(題外話:雖然C++的STL中有sort()函數,但有些算法題用到了歸併排序的思想,如求逆序數,所以歸併排序是必須懂的。固然,網上關於歸併排序的講解不少,這裏僅僅只是給出模板。)
 

模板:算法

 1 void mergeArray(int *a,int l,int mid,int r,int *temp)
 2 {
 3     int i=l,j=mid+1;
 4     int k=0;
 5     
 6     while(i<=mid&&j<=r)
 7     {
 8         if(a[i]<=a[j])
 9             temp[k++]=a[i++];
10         else
11             temp[k++]=a[j++];
12     }
13     
14     while(i<=mid)
15         temp[k++]=a[i++];
16     while(j<=r)
17         temp[k++]=a[j++];
18     
19     for(int i=0;i<k;i++)
20         a[l+i]=temp[i];    
21 }
22 
23 void mergeSort(int *a,int l,int r,int *temp)
24 {
25     if(l<r)
26     {
27         int mid=(l+r)/2;
28         mergeSort(a,l,mid,temp);
29         mergeSort(a,mid+1,r,temp);
30         mergeArray(a,l,mid,r,temp); 
31     }
32 } 

 

題目:洛谷 P1177函數

(雖然題目寫着是快速排序的模板題,但也能看成是其餘時間複雜度與快速排序不相上下的排序算法的模板題)spa

 1 const int Size = 1000000;
 2 int array[Size];
 3 int arrayCopy[Size];
 4 
 5 void mergeArray(int *a,int l,int mid,int r,int *temp)
 6 {
 7     int i=l,j=mid+1;
 8     int k=0;
 9     
10     while(i<=mid&&j<=r)
11     {
12         if(a[i]<=a[j])
13             temp[k++]=a[i++];
14         else
15             temp[k++]=a[j++];
16     }
17     
18     while(i<=mid)
19         temp[k++]=a[i++];
20     while(j<=r)
21         temp[k++]=a[j++];
22     
23     for(int i=0;i<k;i++)
24         a[l+i]=temp[i];    
25 }
26 
27 void mergeSort(int *a,int l,int r,int *temp)
28 {
29     if(l<r)
30     {
31         int mid=(l+r)/2;
32         mergeSort(a,l,mid,temp);
33         mergeSort(a,mid+1,r,temp);
34         mergeArray(a,l,mid,r,temp); 
35     }
36 } 
37 
38 int main()
39 {
40     int n;
41     cin>>n;
42     for(int i=0;i<n;i++)
43     {
44         cin>>array[i];
45     }
46     mergeSort(array,0,n-1,arrayCopy);
47     for(int i=0;i<n;i++)
48     {
49         cout<<array[i]<<" ";
50     }
51 } 
相關文章
相關標籤/搜索