《演算法 第四版》(四)歸併排序

2021-09-10 01:29:22 字數 1789 閱讀 7251

時間複雜度o(n*logn),額外空間複雜度o(n)(具體分析過程請看:遞迴相關演算法的時間複雜度分析(master公式引入))

歸併排序又分為自頂向下自底向上兩種思路,這裡著重說一下自頂向下

1.1 自頂向下

最主要的是這個merge的外排思想,怎麼將兩個陣列合併起來並且排好序(其實下面**中並不需要遞迴,直接 merge(arr, lo, mid, hi);就可以了,但是遞迴後將陣列分為更小的組合然後再mergr效率會更高,這也是歸併排序效率比前面幾個排序演算法高的原因。

外排merge的**,我們簡化後看一下,其實就是將兩個陣列(無論有沒有序,就算沒有序,我們用判斷依然可以排序)來乙個乙個數進行比較,這裡用兩個指標指標兩個陣列的第乙個數(也就是 i 和 j),,加上判斷語句,這樣就遍歷了兩個陣列(注,我這裡只是遍歷),然後加上我們的輔助陣列等操作,來達到排序的目的(在一些其他題,如小和問題、逆序問題,都用到了這個外排的思想)

最重要的思路就是用外排的思想來遍歷兩個陣列,然後我們可以在遍歷的過程中做其他的操作

下面簡化後的外排**:遍歷兩個陣列

private

void

merge

(int

arr,

int lo,

int mid,

int hi)

for(

int k = lo; k <= hi; k++

)else

if(j > hi)

else

if(arrsup[i]

> arrsup[j]

)else

}}

最終的自頂向下的歸併排序**:

package cn.nupt.sort;

/** * @description: 歸併排序(自頂向下)

* * @author pizan

* @date 2023年1月19日 下午9:03:31

* */

public

class

mergesort

private

void

sort

(int

arr,

int lo,

int hi)

//融合兩個已經排序過的陣列

private

void

merge

(int

arr,

int lo,

int mid,

int hi)

for(

int k = lo; k <= hi; k++

)else

if(j > hi)

else

if(arrsup[i]

> arrsup[j]

)else}}

// 遍歷的實現

private

void

show

(int

arr)

}}

1.2 自底向上
package cn.nupt.sort;

/** * @description: 歸併排序(自底向上)

* * @author pizan

* @date 2023年1月20日 上午9:02:05

* */

public

class

mergesort

}show

(arr)

;}

演算法 第四版 2 2歸併排序

歸併排序 是採用分治法 divide and conquer 它的主要思想就是把兩個陣列 各個一定要有序 歸併在乙個陣列中。如乙個陣列要求用歸併進行排序,主要要考慮試實現兩個部分 1 分解 如何將乙個大的陣列逐步分成多個小的有序陣列。2 合併 如何將兩個有序列表並成乙個適當的陣列。則可以兩種進行歸併...

《演算法(第四版)》排序 模板

本書對排序類演算法有乙個模板,包括了以下幾種方法 1 sort 這個方法裡面實現的就是排序的演算法 2 less 這個方法裡是利用了comparable介面裡的compareto方法,其中compareto方法對於本物件與傳入的比較物件小於,等於,大於,分別返回負數,0,正數 這個方法如果compa...

《演算法(第四版)》排序 希爾排序

由 插入排序 可知,它是一種不穩定的演算法,當序列已經接近有序時,排序速度較快,但是如果最小的在最後面,那可能需要最小的交換了n 1次才能換到最前面。希爾排序在插入排序的基礎上進行了改進,交換不相鄰的元素,以對陣列的區域性進行排序,並最終用插入排序將區域性有序的陣列排序,具體做法如下。1.假設陣列長...