淺說歸併排序

2022-02-02 16:56:51 字數 1923 閱讀 5923

今天又習得一排序演算法 :歸併排序  特與大家分享下 一起消化它!

定義:

顧名思義 歸併排序 即是先遞迴獲取排序後的分組 然後將分組合併 最後排序完成

暴力解釋:

首先假如我們有乙個陣列為 [1]   是的 這個陣列就只有乙個數字 有的人就問了 :你這不吭麼? 乙個元素你丫還來排序?  好吧,所以說當陣列中的元素

個數為1時 則遞迴結束 這個組的排序完成!  而且它並不需要合併

那麼當陣列是 [2,1]的時候呢? 這個時候 我們就要將這個陣列分組 一分為二  分別為 陣列arrx=[2]  陣列arry=[1]  我們再分別來看這兩個陣列

首先看arrx  好你個小子 元素總數都為1了 你丫又鬧排序?因此 如前面所言 當乙個組的元素個數為1時 這個組的排序完成 遞迴結束 對於arry亦然

現在兩個組排序完成了 已經變成了兩個有序的陣列 接下來就要將兩個陣列合併了 首先我們先定義乙個 arr陣列 它的長度是arrx和arry的長度之和

然後我們分別來看arrx[0] 和arry[0] 看哪個元素小(此處為公升序排序) 我就把這個元素丟到arr陣列中

這裡arry[0]

即:arr[1]=arrx[0];     這樣 乙個完全排序好的arr陣列就誕生了!

因此所謂的歸併排序 其實就是先將乙個陣列遞迴拆分成n個小陣列 每乙個小陣列的元素個數為1 然後11合併為2    22合併為4  以此類推 一直合併到原來陣列長度

在兩個小陣列合併為乙個大陣列的過程中 兩個小陣列按下標順序一一比較 當某乙個小陣列的元素個數為0時 則另外乙個小陣列只需將餘下的元素拼接到新陣列末尾即

可  最後排序完成!

附上** 不成敬意:(陣列使用微軟封裝好的list更加淺顯易懂)

遞迴拆分:

1

private

static list dividesort(listarr)28

//一分為二 拆分陣列

9int middle = arr.count / 2

;10 list left = new list();

11 list right = new list();

12for (int i = 0; i < middle; i++)

1316

for (int j = middle; j < arr.count; j++)

1720 left =dividesort(left);

21 right =dividesort(right);

22//

進行合併

23return

mergelist(left, right);

24 }

view code

合併排序:

1

private

static list mergelist(list left, listright)213

else

1418}19

//總算有乙個小陣列敗下陣來 因此另外乙個小陣列的剩餘元素 只需按順序新增到大陣列即可

20if (left.count > 0)21

26}27//

同上28

else

if (right.count > 0)29

34}35return

newlist;

36 }

view code

園友,貧道看你骨骼驚奇,儀表非凡,定非池中之物,將來必成大事。這樣吧,右下角有乙個推薦,速度秒了它,我就與你一起拯救世界,如何?

歸併排序(2 路歸併排序)

遞迴寫法 include define maxn 100 void merge int a,int l1,int r1,int l2,int r2 將陣列a的區間 l1,r1 和區間 l2,r2 合併為乙個有序區間 else while i r1 while j r2 for int i 0 i非遞...

python歸併排序 python 歸併排序

排序思路 1.將陣列分成兩組a,b,建立臨時陣列 c,c長度 a b 2.i,j分別屬於a,b 3.若a i b j 將b j 放入c,j 否則 a i 放入c,i 4.迴圈3步驟,將a或b中剩餘的元素放入c,再將c複製到陣列中 5.遞迴3 4直到a,b序列的長度 1 歸併排序 class merg...

排序 歸併排序

歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併 將兩個已經排好序的集合合併到乙個集合眾,並且保證新的集合也是有序的。核心點 只有乙個元素的集合是已經排好序的集合。歸併排序是建立在...