1. 程式人生 > >【排序(C++實現)】:二分歸併排序

【排序(C++實現)】:二分歸併排序

一、虛擬碼

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是將兩個有序數組合併成一個有序陣列的時間複雜度。

解法一:

解法二: