複習一 陣列(6) 歸併排序

2021-10-09 20:08:21 字數 1732 閱讀 2274

歸併排序是建立在歸併操作上的一種有效,穩定的排序演算法。

該演算法是採用分治法的乙個非常典型的應用。

歸併排序的實現由兩種方法:

自上而下的遞迴

自下而上的迭代

思路:

將這個陣列分成一半,直到每一部分

把左邊的陣列排序,右邊的陣列排序。當我們對左邊的陣列和右邊的素組進行排序的時候,再分別將左邊的陣列和右邊的陣列分成一半,然後對每乙個部分先排序,再歸併

對於上面的每乙個部分呢,我們依然是先將他們分半,再歸併

歸併到上乙個層級之後繼續歸併,歸併到更高的層級,直至最後歸併完成

演算法實現:

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

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

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

重複步驟 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));

}

執行結果:

時間複雜度:o(nlogn)

對長度為n的檔案,需進行趟二路歸併,每趟歸併的時間為o(n),故其時間複雜度無論是在最好情況下還是在最壞情況下均是o(nlgn)

空間複雜度:o(n)

需要乙個輔助向量來暫存兩有序子檔案歸併的結果,故其輔助空間複雜度為o(n),

穩定性:穩定

6 歸併排序

歸併排序是歸併兩個有序的序列,這兩個有序序列需要頭尾兩個指標,遍歷這兩個序列,按照排序規則儲存在乙個可以容納這兩個序列的序列中,當遍歷結束,則新的序列為有序序列。當我們需要對某一串行排序時,可以把該序列分成兩半,分別對這兩半進行排序,然後歸併這兩個有序序列。而這兩半又可以遞迴地分半,類似二分法。in...

6 歸併排序

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。nlogn 由於需要兩兩比較 因此也是穩定的!首先考慮下如何將將二個有序數列合併。這個非常簡單,只要從比較二個數列的第乙個數,誰小就先取誰,取了後就在對應數列中刪除這個...

排序 6 歸併排序

參考 排序 0 前言 將序列分為若干個子串行 子串行均有序 兩兩子串行進行歸併操作,得到乙個新的有序列表,最終歸併所有子串行,得到乙個遞增或遞減的序列 從左到右逐個比較兩個子串行中的元素大小,比如進行遞增排序,將較小的元素加入結果序列中,其下標加1,繼續和另乙個序列元素進行比較,直到某乙個序列元素已...