演算法分析(4) 排序 歸併排序

2021-10-12 13:58:07 字數 2671 閱讀 1323

3 自底向上的歸併排序

less和exch可以檢視上一章:

演算法分析(3)-簡單排序總結(選擇,插入,希爾含**)——comparable介面

歸併採用分治法(divide and conquer)的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。歸併排序是一種穩定的排序方法。

自頂向下其實是先完成左側陣列然後完成右側陣列的排序規則:

實現歸併的一種方式就是直接將兩個有序陣列歸併到第三個陣列中,圖示如下:

首先將左右序列排序好的陣列a[k

]a[k]

a[k]

所有元素複製到aux

[k]aux[k]

aux[k]

中:

2. 然後將aux

[k]aux[k]

aux[k]

中的元素歸併到a[k

]a[k]

a[k]

中。

原地歸併演算法如下:

這裡的les

sless

less

可以檢視上一章演算法分析(3)-簡單排序總結(選擇,插入,希爾含**)

//lo第乙個元素,hi最後乙個元素

private

static

void

merge

(comparable[

] a, comparable[

] aux,

int lo,

int mid,

int hi)

}

使用以上的抽象方法可以使用遞迴的方式完成遞迴排序。

首先上**:

//遞迴的實現歸併排序

public

class

merge

//排序

private

static

void

sort

(comparable[

] a,

int lo,

int hi)

}

其實sor

tsort

sort

的的作用只是對mer

gemerge

merg

e執行的順序完成合理呼叫。

這裡直接給出對於長度為n

nn的陣列,自頂向下的歸併排序的比較次數:1/2

nlgn

1/2nlgn

1/2nlg

n~nlgn

nlgn

nlgn

訪問陣列的次數(最多):6nl

gn6nlgn

6nlg

n關於演算法規模的計算以及數學分析的相關證明,會在本專欄之後進行更新。

**後期會在github上更新,目前博主的git在商用,暫時不放優化**

對小規模子陣列使用插入排序

對子陣列隨時檢測是否有序

不講元素複製到輔助陣列

自底向上其實就是從所有陣列中最小分組進行歸併排序

首先進行分解(這裡的分解其實使用遞迴即可):

當分解到最簡元素時進行原地歸併:

//遞迴的實現歸併排序

public

class

merge

}

這裡直接給出對於長度為n

nn的陣列,自頂向下的歸併排序的比較次數:1/2

nlgn

1/2nlgn

1/2nlg

n~nlgn

nlgn

nlgn

訪問陣列的次數(最多):6nl

gn6nlgn

6nlg

n

演算法 1 排序 歸併排序

歸併排序思想 1.把長度為n的輸入序列分成兩個長度為n 2的子串行 2.對這兩個子串行分別採用歸併排序 3.將兩個排序好的子串行合併成乙個最終的排序序列。小結 平均時間複雜度o nlogn 最好情況o nlogn 最壞情況o nlogn 空間複雜度o n 占用額外記憶體 穩定性 穩定 歸併排序入口 ...

3 排序演算法 歸併排序

問題描述 歸併排序演算法對下列例項排序,寫出基於歸併排序演算法對下面例項進行排序的具體過程。a 48,12,61,3,5,19,32,7 解題思想 將n個元素分成2個子集合,分別對子集合進行排序,最終將排好序的子集合合併為有序集合。n 1是中止。如下 include include using na...

alg4 排序 歸併排序

歸併操作 即將兩個有序的陣列歸併成乙個更大的有序陣列。歸併排序示意圖 歸併排序最吸引人的性質是它能夠保證將任意長度為n的陣列排序所需時間和nlogn成正比 它的最主要缺點則是它所需的額外空間和n成正比。原地歸併的抽象方法 它將涉及的所有元素複製到乙個輔助陣列中,再把歸併的結果放回原陣列中。merge...