歸併排序:一種簡單的利用遞迴排序的演算法,將乙個陣列先(遞迴地)將它分成兩半分別排序,然後將兩半分別排序,然後將結果歸併起來。
原地歸併的抽象方法:
public
static
void
merge(int a, int lo, int mid, int hi)
//歸併回a[lo..hi]
for (int k = lo; k <= hi; k++) else
if(j > hi) else
if(b[i] < b[j])else}}
先將所有元素複製到吧b中,然後再歸併回a中。
歸併軌跡如下圖:
自頂向下的歸併排序:
這是基於原地歸併的抽象實現的遞迴歸併,應用了高效演算法設計中的分治思想的典型的例子。
public
static
void
sort(int a, int lo, int hi)
int mid = lo + (hi-lo)/2;
sort(a, lo, mid); //將左半邊排序
sort(a, mid+1, hi); //將右半邊排序
merge.merge(a, lo, mid, hi); //原地歸併的抽象方法
}
要對陣列 a[lo..hi] 進行排序,先將它分為a[lo..mid] 和 a[mid+1..hi] 兩部分,分別通過遞迴呼叫將它們單獨排序,最後將有序的子陣列歸併為最終的排序結果。
歸併結果軌跡:
自底向上的歸併排序:
這種排序的思想是:先歸併那些微型陣列,然後再成對歸併得到的子陣列。
先進行兩兩歸併,然後再四四歸併,再八八歸併。。。
public
static
void
sort(int a)}}
歸併軌跡圖:
特點:
對於長度為n的任意陣列,歸併排序需要(1/2)n/lgn至nlgn次比較,最多需要訪問陣列6nlgn次。
可以用歸併排序處理數百萬甚至更大規模的陣列。
排序演算法學習 歸併排序
歸併排序 merge sort 採用分治思想,將排序的過程分成乙個個子過程,當所有子過程完成時,排序也最終完成了。而歸併排序是將陣列不斷地二分,進而形成乙個個子過程。子過程,即歸併的過程如下圖演示,需要額外開闢一片空間進行複製乙份原陣列,然後兩邊逐一進行比較後進行歸併。至於它的時間複雜度,我們可以看...
遞迴演算法學習(歸併排序)
歸併排序是利用遞迴和分而治之的技術將資料序列劃分成為越來越小的半子表,再對半子表排序,最後再用遞迴步驟將排好序的半子表合併成為越來越大的有序序列,歸併排序包括兩個步驟,分別為 1 劃分子表 2 合併半子表 首先我們來討論歸併演算法,歸併演算法將一系列資料放到乙個向量中,索引範圍為 first,las...
演算法學習(四) 歸併排序
問題 給定陣列,進行排序。方法 歸併排序 merge sort 是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列 即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序...