今天又習得一排序演算法 :歸併排序 特與大家分享下 一起消化它!
定義:
顧名思義 歸併排序 即是先遞迴獲取排序後的分組 然後將分組合併 最後排序完成
暴力解釋:
首先假如我們有乙個陣列為 [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更加淺顯易懂)
遞迴拆分:
1view codeprivate
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 }
合併排序:
1view codeprivate
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 }
園友,貧道看你骨骼驚奇,儀表非凡,定非池中之物,將來必成大事。這樣吧,右下角有乙個推薦,速度秒了它,我就與你一起拯救世界,如何?
歸併排序(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 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併 將兩個已經排好序的集合合併到乙個集合眾,並且保證新的集合也是有序的。核心點 只有乙個元素的集合是已經排好序的集合。歸併排序是建立在...