常見排序演算法總結 3 歸併排序

2021-10-02 23:26:58 字數 2266 閱讀 3138

3、歸併排序:將陣列不斷拆分,拆分為多個只包含單個元素的陣列。再將陣列不斷有序合併,合併為乙個有序的陣列。遞迴、合併簡稱歸併,合併都能理解,那什麼是遞迴呢,遞迴其實就是在一次大規模運算中,其中的一步或幾步計算用到了前面的運算結果,舉個例子:第一天給你一塊錢,第二天給你兩塊錢,第三天四塊,以此類推每天給你的錢都是前一天的一倍,最後要計算100天後一共給了你多少錢。這就是典型的遞迴,計算某天得到的錢數,需要計算前一天的錢數的運算結果。

舉例:原始陣列:(28 12 1 8 23 32 6 19)

第一次拆分:(28 12 1 8)(23 32 6 19)

第二次拆分:(28 12)(1 8)(23 32)(6 19)

第三次拆分:(28)(12)(1)(8)(23)(32)(6)(19)

第一次合併:(12 28)(1 8)(23 32)(6 19)

第二次合併:(1 8 12 28)(6 19 23 32)

第三次合併:(1 6 8 12 19 23 28 32)

分析:進行log(2)(n)=log(2)(8)=3次的拆分後,拆分為n=8個單元素的陣列。再進行3次的有序合併後,合併為8個元素的有序陣列。

**邏輯:因為拆分和合併都是相同的操作,所以只需要寫乙個拆分的函式,再寫乙個合併的函式,然後在拆分的函式中呼叫自己(自己呼叫自己,相當於我秀我自己,鐵鍋燉自己?)。拆分函式需要找到中間值,然後呼叫sublist()函式進行拆分,最後return呼叫合併函式為最終結果即可。合併函式需要迴圈n次(n為兩個需要合併陣列的大小總和),每次取出兩個陣列中最小的元素,放入返還陣列中。

**示例(**工具-as):

public

static

void

main

(string args)

/**

* 歸併排序

* @param list 需要排序的陣列

* @return 排序成功的陣列

*/private

static arraylist

split

(arraylist

list)

int i = list.

size()

/2;//取list大小一半的值,為了平均拆分list

arraylist

leftlist =

split

(new

arraylist

<

>

(list.

sublist(0

,i)));

//拆分後左側的list

arraylist

rightlist =

split

(new

arraylist

<

>

(list.

sublist

(i,list.

size()

)));

//拆分後右側的list

return

merge

(leftlist,rightlist)

;}

/**

* 將兩個有序陣列有序合併為乙個陣列

* @param leftlist 第乙個有序陣列

* @param rightlist 第二個有序陣列

* @return 合併的陣列

*/private

static arraylist

merge

(arraylist

leftlist,arraylist

rightlist)

else

if(rightlist.

size()

<1)

else

else}}

return relist;

}

/**

* 列印陣列

* @param list 要列印的陣列

* @param string 列印字首

*/private

static

void

log(arraylist

list,string string)

else}if

(string == null)

else

}

結果一覽

結果分析:歸併排序要拆分至成n(n為陣列元素個數)個單一元素的陣列,再將這些單一陣列有序合併成幾次後合併為乙個陣列,無論陣列的元素順序,耗費的時間均相同

排序演算法 3 歸併排序

這篇博文分為四個部分 歸併排序基本思想 基礎 實現與解析 一次優化 二次優化 自底向上的歸併排序 1.歸併排序基本思想 3 歸併排序 小到大排序 1.迴圈的將每乙個部分都分為原來的一半 直到最後每一部分只剩下乙個元素 2.迴圈的將每兩個部分進行合併並且排序 直到最後全部合併 o n log n 2....

常見的排序演算法示例(3) 歸併排序 堆排序

一 歸併排序演算法 基本思想 歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併排序示例 合併方法 設r i n 由兩個有序子表r i m 和r m 1 n 組成,兩個子表長度分別為...

排序演算法總結之 歸併排序

歸併就是將兩個或多個有序的序列合併成乙個有序序列的過程。二路歸併排序是面試中考查最多的排序演算法之一。歸併排序有兩種 1 一般歸併排序,空間複雜度o n 2 原地歸併排序,空間複雜度o 1 基本思想 將兩個或者兩個以上的有序表合成乙個新的有序表。歸併排序無論是順序儲存還是鏈式儲存結構都有較好的效能。...