1. 程式人生 > 實用技巧 >PHP開發之微信公眾號中進行支付寶支付(二)

PHP開發之微信公眾號中進行支付寶支付(二)

歸併排序

什麼是Merge(歸併/合併)?

歸併:把兩個或多個已經有序的序列合併成一個

首先先定義一個更大的陣列

接下來可以分別設定指標指向陣列的第一個元素

再來就是把指向合併的散裝數組裡的元素進行對比。。誰小誰進大陣列

只剩下一個子表未合併時,可以將該表中剩餘元素全部加到總表

“2路”歸併

兩個或多個已經有序的序列合併成一個

“2路”歸併——每選出一個小的元素需對比關鍵字1次

“4路”歸併

每選出一個小的元素需要對比關鍵字3次。

結論:m路歸併,每選出一個元素需要對比關鍵字m-1次

歸併排序(手算模擬)

在內部排序中一般採用2路歸併

第一躺的歸併排序,把相鄰的兩個部分分別進行2路歸併

第二趟,在對上一趟的歸併進行2路歸併

第三趟就可以得到了

13,27,38,49,65,76,97

核心操作:把陣列內的兩個有序序列歸併為一個

程式碼實現

int *B = (int *)malloc(n*sizeof(int));	//輔助陣列B

//A[low...mid]和A[mid+1...high]各自有序,將兩個部分歸併
void Merge(int A[],int low,int mid,int high){
    int i,j,k;
    for(k=low;k<=high;k++)
        B[k] = A[k];					//將A中所有元素複製到B中
    for(i=low,j=mid+1,k=i;i<=mid&&j<=high;k++){
        if(B[i]<=B[j])
            A[k]=B[i++];				//將較小值複製到A中
        else
            A[k]=B[j++];
    }
    while(i<=mid)	A[k++]=B[i++];
    while(j<=high)	A[k++]=B[j++];
}

void MergeSort(int A[],int low,int high){
    if(low<high){
        int mid = (low+high)/2;
        MergeSort(A,low,mid);
        MergeSort(A,mid+1,high);
        Merge(A,low,mid,high); 
    }
}

演算法效率分析

2路歸併的“歸併樹”——形態上就是一棵倒立的二叉樹

\[二叉樹的第h層最多有2^{h-1}個結點 \]

\[若樹高為h,則應滿足n\le2^{h-1} \]

\[即h-1=\lceil log_2n \rceil \]

\[結論:n個元素進行2路歸併排序,歸併趟數=\lceil log_2n \rceil \]

\[每趟歸併時間複雜度為O(n),則演算法時間複雜度為O(nlog_2n) \]

\[空間複雜度=O(n),來自輔助陣列B \]

歸併演算法是穩定的。自己操作。

知識回顧