歸併排序的思想是將幾個相鄰的有序表合併成乙個總的有序表,下面主要討論二路歸併排序。
1、兩個有序表的合併
二路歸併排序的基本操作是將兩個相鄰的有序表合併為乙個有序表。下面是將兩個順序儲存的有序表合併為乙個有序表的演算法:
設兩個有限子表r[s]……r[m]和r[m+1]……r[t],將兩個有序子表合併為乙個有序表r1[s]……r1[t]。合併演算法如下:
要注意:該合併演算法要求兩個有限子表是相鄰的,即r[s]……r[m]和r[m+1]……r[t]。
2、二路歸併排序的迭代演算法
二路歸併的基本思想是:只有乙個元素的表總是有序的,所以將排序表r[1……n],看做是n個長度為len=1的有序子表,對相鄰的兩個有序子表兩兩合併到r1[1……n],使之生成表長len=2的有序表;再進行兩兩合併到r[1……n]中,……,直到最後生成表長len=n的有序表。
每趟排序中首先要解決分組的問題,設本趟排序中從r[1]開始,長度為len的子表有序,因為表長n未必是2的整數冪,這樣最後一組就不能保證恰好是表長為len的有序表也不能保證每趟歸併時都有偶數個有序子表,這些都要在一趟排序中考慮到。
例:有排序表36 20 18 10 60 25 30 18 12 56,歸併排序過程如下圖示:
一趟歸併演算法:
二路歸併排序:
3、二路歸併排序的遞迴演算法
演算法之歸併排序
歸併排序 void mergearray int a,int temp,int left,int mid,int right else while i1 mid while i2 right for int i 0 i k i 上面 為合併a left,mid 和a mid 1,right 的 因為...
演算法之歸併排序
歸併排序是分治法 divide and conquer 的經典案例。分治模式在每一層遞迴上都有三個步驟 分解 divide 將原問題分解成一系列子問題 解決 conquer 遞迴地解各子問題。若子問題足夠小,則直接求解 合併 combine 將子問題的結果合併成原問題的解。歸併排序 merge so...
排序演算法之歸併排序
歸併排序也是經典的使用分治法思想的代表演算法之一。歸併排序的效率很高,而且是一種穩定的排序。其總體的思想思路就是將待排序的元素分成大致相同的兩個子集合,分別對兩個子集合進行排序,最終將排序的子集合合併成排好序的總集合 歸併排序c 實現如下 include void mergesort int arr...