Java排序演算法 歸併排序

2021-08-27 07:28:12 字數 1439 閱讀 4585

歸併排序(merge)是將兩個(或兩個以上)有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。 將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為2-路歸併。

歸併排序演算法穩定,陣列需要o(n)的額外空間,鍊錶需要o(log(n))的額外空間,時間複雜度為o(nlog(n)),演算法不是自適應的,不需要對資料的隨機讀取。

工作原理:

1、申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列

2、設定兩個指標,最初位置分別為兩個已經排序序列的起始位置

3、比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置

4、重複步驟3直到某一指標達到序列尾

5、將另一串行剩下的所有元素直接複製到合併序列尾

**實現:

publicvoidmergesort()

privatevoidrecmergesort(longworkspace,

intlowerbound,

intupperbound)

else

}privatevoidmerge(longworkspace,

intlowptr,

inthighptr,

intupperbound)

else

}while(lowptr<=mid)

while(highptr<=upperbound)

for(j=0;j

thearray[lowerbound+j]=workspace[j];}}

歸併排序是比較穩定的排序.即相等的元素的順序不會改變.如輸入記錄 1(1) 3(2) 2(3) 2(4) 5(5) (括號中是記錄的關鍵字)時輸出的 1(1) 2(3) 2(4) 3(2) 5(5) 中的2 和 2 是按輸入的順序.這對要排序資料報含多個資訊而要按其中的某乙個資訊排序,要求其它資訊盡量按輸入的順序排列時很重要.這也是它比快速排序優勢的地方.

java排序演算法 歸併排序

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divideand conquer 的乙個非常典型的應用。在討論歸併排序演算法之前,先來看乙個小問題,對於兩個有序陣列,如何合併成乙個有序陣列問題。public static voidmerge intaa,intbb else...

排序演算法 歸併排序 (java)

歸併排序,顧名思義,就是將資料進行合併,我們首先將待排陣列分成兩個子串行,然後在對其單個序列進行排序,不斷遞迴到只有兩個元素的子串行,然後再向上返回,最中得到的是兩個有序的子串行,最後我們通過乙個輔助陣列,遍歷這兩個陣列,挑選出較小的元素將其放在輔助陣列中,這樣我們就會在輔助陣列中將數排好序了,然後...

Java排序演算法 歸併排序

歸併排序 merge 是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。將已有...