遞迴與分治策略 2 7歸併排序及其優化總結

2021-08-09 01:58:51 字數 1519 閱讀 8205

引言:眾所周知,歸併排序(合併排序)演算法是基於分治策略的乙個排序演算法,其基本思想是:將待排序元素分成大小大致相同的2個子集合,分別對2個子集合進行排序,最終將排序好的子集合合併成為所要求的排好序的集合。具體過程如下圖所示(**源於網路):

如圖所示:歸併排序需要三個索引分別是ijk。其中i指向帶排序第乙個子集合待比較元素,j指向待排序另乙個子集合待比較元素,k指向陣列b中的元素。

遞迴**如下:

public

static

void

mergesort(int a,int l,int r)

public

static

void

merge(int a,int b,int l,int m,int r)else b[k++] = a[j++];

}//2.對結尾元素進行處理

if(i<=m)else

//3.複製回陣列a

for(int q=l;q<=r;q++)

a[q] = b[q];

}

執行結果如下:

初始陣列:49 38 65 97 76 13 27 

排序陣列:13 27 38 49 65 76 97

讀者可以發現在mergesort遞迴演算法裡面,每一次都要進入merge方法進行合併,可事實並不是每一次都需要。比如歸併的兩部分陣列拼接到一起就已經是成序的陣列或者輸入的陣列就已經是有序的陣列,這樣就不需要再進一步合併。因此可以在此前加乙個判斷即可減少一定的歸併次數

優化**如下:

public

static

void

mergesort(int a,int l,int r)

以上通過判斷第一部分陣列的最後乙個元素是否小於另一部分陣列第乙個元素來實現,即加上if(a[m]>a[m+1])判斷。因為兩部分陣列已經各自成序,只要判斷其邊緣元素大小即可。

補充:以上只討論了歸併排序的遞迴實現,是自頂向下的,實際上還有迭代法的實現,即自底向上。迭代法程式比遞迴法略長,但特點是可無需向陣列中通過索引讀取元素,這使得迭代法可用在資料結構是鍊錶的情況下進行排序。

遞迴與分治 歸併排序

描述 給定乙個數列,用歸併排序演算法把它排成公升序。輸入 第一行是乙個整數n n不大於10000 表示要排序的數的個數 下面一行是用空格隔開的n個整數。輸出 輸出排序後的數列,每個數字佔一行。輸入樣例 5 3 2 1 4 5 輸出樣例 1 2345 基本思路 歸併排序是將一組無序的數列,先一分為二,...

歸併排序 分治策略

歸併排序 merge sort 是利用歸併的思想實現的排序方法,該演算法採用經典的分治 divide and conquer 策略 分治法將問題分 divide 成一些小的問題然後遞迴求解,而治 conquer 的階段則將分的階段得到的各答案 修補 在一起,即分而治之 private var arr...

ACM 歸併排序與快速排序(遞迴與分治)

歸併排序的內容可在紫書p226裡面檢視,紫書裡的 寫得十分簡潔,高效,重點要理解好循壞條件的控制。快排可參考以下的部落格 歸併排序時間複雜度 o nlogn 快排時間複雜度 平均o nlogn 最慢o n 2 歸併排序穩定但佔空間比較大,快排佔空間較小但不穩定。以下為 實現 includeusing...