歸併排序是建立在歸併操作上的一種有效,穩定的排序演算法。
該演算法是採用分治法的乙個非常典型的應用。
歸併排序的實現由兩種方法:
自上而下的遞迴
自下而上的迭代
思路:
將這個陣列分成一半,直到每一部分
把左邊的陣列排序,右邊的陣列排序。當我們對左邊的陣列和右邊的素組進行排序的時候,再分別將左邊的陣列和右邊的陣列分成一半,然後對每乙個部分先排序,再歸併
對於上面的每乙個部分呢,我們依然是先將他們分半,再歸併
歸併到上乙個層級之後繼續歸併,歸併到更高的層級,直至最後歸併完成
演算法實現:
申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列
設定兩個指標,最初位置分別為兩個已經排序序列的起始位置
比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置
重複步驟 3 直到某一指標達到序列尾
將另一串行剩下的所有元素直接複製到合併序列尾
public
static
void
sort
(int
arr,
int left,
int mid,
int right)
else
}//將左邊序列中剩餘的數放入臨時陣列
while
(i<=mid)
//將右邊序列中剩餘的數放入臨時陣列
while
(j<=right)
//將臨時陣列中的元素位置對應到真真實的陣列中
for(
int m=
0;mpublic
static
void
mergesort
(int
arr,
int left,
int right)
}public
static
void
main
(string[
] args)
; system.out.
println
("原arr陣列為:"
+arrays.
tostring
(arr));
mergesort
(arr,
0,arr.length-1)
; system.out.
println
("歸併排序後arr為:"
+arrays.
tostring
(arr));
}
執行結果:![](https://pic.w3help.cc/3fb/063709bceefb67d8e879dcb11f8c6.jpeg)
時間複雜度:o(nlogn)
對長度為n的檔案,需進行趟二路歸併,每趟歸併的時間為o(n),故其時間複雜度無論是在最好情況下還是在最壞情況下均是o(nlgn)
空間複雜度:o(n)
需要乙個輔助向量來暫存兩有序子檔案歸併的結果,故其輔助空間複雜度為o(n),
穩定性:穩定
6 歸併排序
歸併排序是歸併兩個有序的序列,這兩個有序序列需要頭尾兩個指標,遍歷這兩個序列,按照排序規則儲存在乙個可以容納這兩個序列的序列中,當遍歷結束,則新的序列為有序序列。當我們需要對某一串行排序時,可以把該序列分成兩半,分別對這兩半進行排序,然後歸併這兩個有序序列。而這兩半又可以遞迴地分半,類似二分法。in...
6 歸併排序
歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。nlogn 由於需要兩兩比較 因此也是穩定的!首先考慮下如何將將二個有序數列合併。這個非常簡單,只要從比較二個數列的第乙個數,誰小就先取誰,取了後就在對應數列中刪除這個...
排序 6 歸併排序
參考 排序 0 前言 將序列分為若干個子串行 子串行均有序 兩兩子串行進行歸併操作,得到乙個新的有序列表,最終歸併所有子串行,得到乙個遞增或遞減的序列 從左到右逐個比較兩個子串行中的元素大小,比如進行遞增排序,將較小的元素加入結果序列中,其下標加1,繼續和另乙個序列元素進行比較,直到某乙個序列元素已...