PHP開發之微信公眾號中進行支付寶支付(二)
阿新 • • 發佈:2020-07-16
歸併排序
什麼是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 \]
歸併演算法是穩定的。自己操作。