資料結構 歸併排序 C++

liangtongzhuo發表於2017-12-14

個人對歸併排序的理解 1.也是分治法 2.先拆分,拆分總序列, (先不考慮奇數) 第一次拆分為N個子序列, 每個子序列元素有1個,倆倆合併子序列 第二次拆分為N/2子序列,每個子序列元素有2個, 倆倆合併子序列 第三次拆分為N/4子序列,每個子序列元素有4個,倆倆合併子序列 ----------n/2^n ------------------ 2^n
...最後拆分為2個子序列,每個子序列元素有N/2個,倆倆合併子序列,成為新的有序序列 3.因為拆分的子序列都是有序的,合併速度非常快。歸併效率很高

時間複雜度 平均速度 O(N*logN) 穩定排序 #include using namespace std;

        void print(int a[], int n){
            for(int j= 0; j<n; j++){
                cout<<a[j] <<"  ";
            }
            cout<<endl;
        }

        //將r[i…m]和r[m +1 …n]歸併到輔助陣列rf[i…n]
        void Merge(int *r,int *rf, int i, int m, int n)
        {
            int j,k;
            for(k=i,j=m+1; i<=m && j <=n ; ++k){
                if(r[j] < r[i]) rf[k] = r[j++];
                else rf[k] = r[i++];
            }
            while(i <= m)  rf[k++] = r[i++];
            while(j <= n)  rf[k++] = r[j++];
        //    print(rf,n+1);
            

        }

        void MergeSort(int *r, int *rf, int lenght)
        {
            int len = 1;
            int *q = r ;
            int *tmp ;
            while(len < lenght) {

                len = 2 * len ;
                int i = 0;
                while(i+ len <lenght) {
                    Merge(q, rf,  i, i+ len/2 -1, i+ len-1 ); //對等長的兩個子表合併
                    i = i+ len;
                }
                if(i + len/2 < lenght+1){ // 這裡要+1
                    Merge(q, rf,  i, i+ len/2 -1, lenght -1); //對不等長的兩個子表合併
                }
                tmp = q; q = rf; rf = tmp; //交換q,rf,以保證下一趟歸併時,仍從q 歸併到rf
            }
        }


        int main(){
            int a[19] = {3,1,5,7,2,4,9,6,8,0,20,3,5,6,7,-1,-1,-2,0};
            int b[19];
            MergeSort(a, b,19);
            cout<<"結果:";
            print(b,19);
            
        }
複製程式碼
  • ######看我那麼可愛n(≧▽≦)n
  • 關注我的微薄 (樑同桌):http://weibo.com/tongrenyinsheng
  • 個人部落格: http://www.liangtongzhuo.com
  • ios 個人寫的app (同人音聲)ASMR音樂

相關文章