歸併排序演算法(C 實現)

2021-08-27 13:40:51 字數 2157 閱讀 5498

歸併排序(merge sort)是利用"歸併"技術來進行排序。歸併是指將若干個已排序的子檔案合併成乙個有序的檔案。歸併排序有兩種方式:1):自底向上的方法2):自頂向下的方法

1、 自底向上的方法

(1) 自底向上的基本思想

自底向上的基本思想是:第1趟歸併排序時,將待排序的檔案r[1..n]看作是n個長度為1的有序子檔案,將這些子檔案兩兩歸併,若n為偶數,則得到n/2個長度為2的有序子檔案;若n為奇數,則最後乙個子檔案輪空(不參與歸併)。故本趟歸併完成後,前n/2 - 1個有序子檔案長度為2,但最後乙個子檔案長度仍為1;第2趟歸併則是將第1趟歸併所得到的n/2個有序的子檔案兩兩歸併,如此反覆,直到最後得到乙個長度為n的有序檔案為止。

上述的每次歸併操作,均是將兩個有序的子檔案合併成乙個有序的子檔案,故稱其為"二路歸併排序"。類似地有k(k>2)路歸併排序。

2、自頂向下的方法(本文主要介紹此種方法,下面的文字都是對此種方法的解讀)

(1) 自頂向下的基本思想

採用分治法進行自頂向下的演算法設計,形式更為簡潔。

自頂向下的歸併排序:是利用遞迴和分而治之的技術將資料序列劃分成為越來越小的半子表,再對半子表排序,最後再用遞迴步驟將排好序的半子表合併成為越來越大的有序序列,歸併排序包括兩個步驟,分別為:

1)劃分子表

2)合併半子表

(1)分治法的三個步驟

設歸併排序的當前區間是r[low..high],分治法的三個步驟是:

①分解:將當前區間一分為二,即求**點

②求解:遞迴地對兩個子區間r[low..mid]和r[mid+1..high]進行歸併排序;

③組合:將已排序的兩個子區間r[low..mid]和r[mid+1..high]歸併為乙個有序的區間r[low..high]。

遞迴的終結條件:子區間長度為1(乙個記錄自然有序)。

如下演示遞迴的整個過程:

遞迴便是深度遍歷(如下由左至右進行遍歷):假設有這樣的一列陣列進行劃分的順序如下:

--> ,

--> ,

--> ,

--> ,

-->,

--> ,

-->,

-->,

當深度劃分到左右陣列都只剩1個元素的時候,進行上述逆序的合併:

, --> 然後和 -->

, --> 然後 和 -->

, -->

, --> 然後 和 -->

最終和 -->

具體實現**如下所示:

//

歸併排序(目標陣列,子表的起始位置,子表的終止位置)

private

static

void mergesortfunction(int array, int first, int last)

}catch (exception ex)}//

歸併排序的核心部分:將兩個有序的左右子表(以mid區分),合併成乙個有序的表

private

static

void mergesortcore(int array, int first, int mid, int last)

else

//此時左子表的數 > 右子表的數}//

有一側子表遍歷完後,跳出迴圈,將另外一側子表剩下的數一次放入暫存陣列中(有序)

while (indexa <= mid)

while (indexb <= last)

//將暫存陣列中有序的數列寫入目標陣列的制定位置,使進行歸併的陣列段有序

tempindex = 0;

for (int i = first; i <= last; i++)

}catch (exception ex)

}

對於n個元素的陣列來說, 如此劃分需要的層數是以2為底n的對數, 每一層中, 每乙個元素都要複製到結果陣列中, 並複製回來, 所以複製2n次, 那麼對於歸併排序,它的時間複雜度為o(n*logn), 而比較次數會少得多, 最少需要n/2次,最多為n-1次, 所以平均比較次數在兩者之間. 它的主要問題還是在於在記憶體中需要雙倍的空間.

歸併排序演算法實現(C )

歸併操作 merge 也叫歸併演算法,指的是將兩個已經排序的序列合併成乙個序列的操作 1 i 3 1 6 8 38 100 202 301 4 根據例子實現的演算法為 include using namespace std int a void merge array int a,int n,int...

C 實現歸併排序演算法

歸併 歸併排序 merge sort 是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列 即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。演算法描...

歸併排序演算法實現

const int maxn 100 將陣列a的 l1,r1 與 l2,r2 區間合併為有序區間 此處l2即為r1 1 void merge int a,int l1,int r1,int l2,int r2 while i r1 temp index a i 將 l1,r1 剩餘元素加入temp ...