【排序(C++實現)】:二分歸併排序
阿新 • • 發佈:2019-01-02
一、虛擬碼
1. MergeSort(A,l,r)
2. Merge(A,l,m,r)
二、C/C++程式碼
/*******************************************************************
Function:Merge Description:將兩個有序的陣列A[l,m]和A[m+1,r]合併為一個有序的陣列 Input:陣列A及下標l,m,r Output:有序陣列A ********************************************************************/ void Merge(int A[],int l,int m,int r){ int x = m-l+1,y=r-m;//x表示陣列A[l...m]的長度,y表示陣列A[m+1,r]的長度 int *B = new int[x]; int *C = new int[y]; for(int i=0,j=l;i<x;i++,j++)//將A[l,m]複製到B中 B[i]=A[j]; for(int i=0,j=m+1;i<y;i++,j++)//將A[m+1,r]複製到C中 C[i]=A[j]; int i=0,j=0,k=l;//i是陣列B的遊標,j是陣列C的遊標,k是陣列A的遊標 while(i<x&&j<y){ if(B[i]<=C[j]) A[k++]=B[i++]; else A[k++]=C[j++]; } //如果B或者C中還有剩餘的數字,則全部複製到A中 if(i>=x) while(j<y)A[k++]=C[j++]; else while(i<x)A[k++]=B[i++]; } /************************************************ Function:MergeSort Description:對陣列A[l,r]進行二分歸併排序 Input:陣列A及其下標l,r Output:有序陣列A *************************************************/ void MergeSort(int A[],int l,int r){ if(l<r){ int m = (l+r)/2; MergeSort(A,l,m); MergeSort(A,m+1,r); Merge(A,l,m,r); } }
三、時間複雜度
由分治的思想知,對一個數組排序可以轉換為將原陣列一分為二,各種排序後在合併的過程。設該演算法的最壞時間複雜度為W(n),則遞推公式如下:
其中n-1是將兩個有序數組合併成一個有序陣列的時間複雜度。
解法一:
解法二: