public
class
merge
private
static boolean issorted
(comparable[
] a)
private
static boolean less
(comparable v,comparable w)
private
static
void
show
(comparable[
] a)
private
static
void
merge
(comparable[
] a,int lo,int mid,int hi)
public
static
void
sort
(comparable[
] a)
private
static
void
sort
(comparable[
] a,int lo,int hi)
public
static
void
main
(string[
] args)
}
實現策略
實現歸併的方法是將兩個不同的有序陣列歸併到第三個陣列中通過建立乙個額外的陣列,將兩個陣列中較小的值乙個乙個的放到新陣列中,對大陣列進行遞迴變為乙個乙個小的陣列進行歸併排序。歸併使用原地歸併的方式,不需要每次merge操作都建立額外的駐足,只需要在排序初始建立乙個陣列大小的空間,一次性分配aux = new comparable[n]
。
分析假設對16個元素進行排序,會先對左邊a[0…7]排序(sort(lo,mid)),然後對a[0…3]進行排序,然後對a[0…1]排序,然後對a[0]和a[1]進行歸併操作(merge(a,lo,mid,hi)),然後對a[2]和a[3]進行歸併,在對a[0…1]和a[2…3]進行歸併,以此類推。
以圖中樹狀圖按照成本模型:
已知條件:
每次merge
操作會進行陣列長度次比較操作
n個數會形成2n層樹->n = lgn
按照成本模型比較次數進行分析,如**可知。假設具有n層,第k層對應的陣列個數有2k個,每個陣列的長度是2n-k,固會進行2n-k次比較,每層會進行2n次比較,具有n層,則會進行總共n2n=nlgn次比較
改進在merge中新增if(less(a[mid],a[mid+1]))
當已經有序的情況不在進行歸併操作。
自底向上的歸併排序
前文列出的排序是自頂向下的歸併排序,將大陣列變為乙個乙個小陣列進行排序,是演算法中分治思想的使用,而自底向上的歸併排序更加的自然、循序漸進。按照迴圈的方法處理。
// 自底向上的歸併排序
public
static
void
sortfrombottmtotop
(comparable[
] a)
動態示意圖
排序 歸併排序
歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併 將兩個已經排好序的集合合併到乙個集合眾,並且保證新的集合也是有序的。核心點 只有乙個元素的集合是已經排好序的集合。歸併排序是建立在...
排序 歸併排序
歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。2 路歸併演算法 1.演算法基本思路 設兩個有序的子檔...
排序 歸併排序
利用遞迴的思想,當n 1時,只有乙個元素需要排序,為遞迴臨界條件 否則,遞迴的將前半部分資料和後半部分資料各自歸併排序,得到排序後的兩部分資料,然後再將得到的兩部分合併到一起。mergesort algorithm public void mergesort int data mergesort例程...