歸併排序也稱合併排序,其演算法思想是將待排序序列分為兩部分,依次對分得的兩個部分再次使用歸併排序,之後再對其進行合併。僅從演算法思想上了解歸併排序會覺得很抽象,接下來就以對序列a[0], a[l]…, a[n-1]進行公升序排列來進行講解,在此採用自頂向下的實現方法,操作步驟如下。通過分析,宣告「治」的函式:void merge(int arr,int low,int mid,int high);(1)將所要進行的排序序列分為左右兩個部分,如果要進行排序的序列的起始元素下標為first,最後乙個元素的下標為last,那麼左右兩部分之間的臨界點下標mid=(first+last)/2,這兩部分分別是a[first … mid]和a[mid+1 … last]。
(2)將上面所分得的兩部分序列繼續按照步驟(1)繼續進行劃分,直到劃分的區間長度為1。
(3)將劃分結束後的序列進行歸併排序,排序方法為對所分的n個子序列進行兩兩合併,得到n/2或n/2+l個含有兩個元素的子串行,再對得到的子串行進行合併,直至得到乙個長度為n的有序序列為止。下面通過一段**來看如何實現歸併排序。
取自:c語言中文網
取自:
生命「分」的函式:void merge_sort(int arr,int first,int last);
merge_sort函式**如下:
void
merge_sort
(int arr,
int first,
int last)
return
;}
merge函式**如下:
void
merge
(int arr,
int low,
int mid,
int high)
else}if
(left_low<=left_high)}if
(right_low<=right_high)
}for
(int i =
0;i1;i++
)free
(tmp)
;return
;}
標記1與標記2,例:4578,1236,上圖中資料。4與1比較:1存入,右移到2
4與2比較:2存入,右移到3
4與3比較:3存入,右移到6
4與6比較:4存入,左側右移到5
5與6比較:5存入,左側右移到7
6與7比較:6存入。右側無法移動,所以需要將剩下的78加入到tmp中。
陣列歸併排序
include include using namespace std void print int a 歸併排序 思路 1 歸併排序 條件 小下標小,大下標大 分別對左半段和右半段進行歸併排序,然後合併 2 合併 把當前待排序列複製乙份 原來的陣列放排好序的元素 分兩段,依次比較左半段和右半段的元...
歸併排序筆記
將兩個的有序數列合併成乙個有序數列,我們稱之為 歸併 歸併排序 如果要將乙個陣列排序,可以先 遞迴地 將它們分成兩半進行排序,然後將結果歸併起來。下面介紹另外兩種方法,分別是自頂向下歸併和自底向上歸併,圖示參考連線 但是我感覺裡面的那個自下而上的演算法感覺有點複雜,所以我總結了演算法第四版上的 如下...
c 歸併排序
1.需求 將乙個陣列通過歸併排序排成有序陣列 2.思想 歸併排序是分治法的乙個典型應用,將兩個有序的序列合併成乙個有序的序列稱為歸併,歸併排序,通過將陣列分成若干個有序的序列,當拆分成只有乙個數時認為是有序的,然後將這些序列歸併。這裡需要用到遞迴。3.實現 public class msort 歸併...