歸併排序可以看作乙個分而治之的過程:先將整個序列分為兩半,對每一半分別進行歸併排序,將得到兩個有序序列,然後將這兩個序列歸併成乙個序列即可
// sr和tr1、tr2是等長的,由於是對不同的區間進行修改,故各子過程不會相互影響
// sr不會發生改變
// tr2儲存的是中間過程
// tr1的結果會返回到上一層的tr2,作為上一層的中間結果
void
mergesort
(int sr,
int tr1,
int low,
int high)
// 將無序的sr[low...high]歸併排序為有序的tr1[low...high]
}void
merge
(int tr2,
int tr1,
int low,
int mid,
int high)
// 將有序tr2[low...mid]和tr2[mid+1...high]歸併到tr1[low...high]
else
}while
(i<=mid)
while
(j<=high)
}
由演算法程式可得 t(n)=t(n/2)+n,其中,n是指當前的歸併操作的執行次數(即:要歸併的兩個子串行中關鍵字個數之和),故時間複雜度為 o(nlog n)
可見歸併排序時間複雜度和初始序列無關,即平均時間複雜度、最好時間複雜度、最壞時間複雜度均為 o(nlog n)
因為歸併排序需要轉存整個待排序列,需要用到tr1[ ]和tr2[ ],故其空間複雜度為o(n)
歸併排序是把序列遞迴地分成短序列,遞迴出口是短序列只有1個元素(認為直接有序)或者2個序列(1次比較和交換),然後把各個有序的段序列合併成乙個有序的長序列,不斷合併直到原序列全部排好序。可以發現,在1個或2個元素時,1個元素不會交換,2個元素如果大小相等也沒有人故意交換,這不會破壞穩定性。那麼,在短的有序序列合併的過程中,穩定是是否受到破壞?沒有,合併過程中我們可以保證如果兩個當前元素相等時,我們把處在前面的序列的元素儲存在結果序列的前面,這樣就保證了穩定性。所以,歸併排序也是穩定的排序演算法。
排序 歸併排序
歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併 將兩個已經排好序的集合合併到乙個集合眾,並且保證新的集合也是有序的。核心點 只有乙個元素的集合是已經排好序的集合。歸併排序是建立在...
排序 歸併排序
歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。2 路歸併演算法 1.演算法基本思路 設兩個有序的子檔...
排序 歸併排序
利用遞迴的思想,當n 1時,只有乙個元素需要排序,為遞迴臨界條件 否則,遞迴的將前半部分資料和後半部分資料各自歸併排序,得到排序後的兩部分資料,然後再將得到的兩部分合併到一起。mergesort algorithm public void mergesort int data mergesort例程...