歸併排序 mergeSort 之遞迴實現

2021-07-11 00:50:07 字數 1512 閱讀 7219

歸併排序其實要做兩件事:

(1)「分治策略」——將序列每次折半劃分,遞迴分治。

遞迴的將陣列的前半部分和後半部分資料各自歸併排序,得到排序後的兩部分資料,然後使用下面的合併演算法再將這兩部分合併到一起。

(2)「合併演算法」——將劃分後的序列段兩兩合併後排序。

基本的合併演算法是取兩個輸入陣列a和b,乙個輸出陣列c,以及三個計數器aptr,bptr和cptr它們的初始位置對應於陣列的開始端。a[aptr]和b[bptr]中的較小者被拷貝到c中的下乙個位置,相關計數器向前推進一步。當前輸入表有乙個用完的時候,則將另乙個表中剩餘部分拷貝到c中。

// 分治,遞迴

templatevoid msort(t a, t temparr, int left, int right)

}// 合併

templatevoid merge(t a, t temparr, int lpos, int rpos, int rend)

// 其中一部分的元素用完

// 把左邊部分剩餘元素拷貝到temparr中

while (lpos <= lend)

while (rpos <= rend)

// 把臨時陣列temparr中元素拷貝到a陣列中

for (int i = 0; i < len; ++i)

/* error */

//for (int i = len; i >= 0; --i)

/* ok */

//for (int i = 0; i < len; ++i, --rend)

}templatevoid mergesort(t a, int n)else

cout << "no space for temp array!";

}void main();

int n = 8;

mergesort(a, 8);

cout << "歸併排序後的元素:";

for (int i = 0; i < n; ++i)

cin.get();

}-時間複雜度:最壞情況、平均情況和最好情況都是o(nlogn),該演算法為穩定的演算法;

-空間複雜度o(n),在演算法處理過程中,需要乙個大小為n的臨時儲存空間用以儲存合併序列;

- 歸併排序和堆排序、快速排序的比較

空間複雜度:堆排序 < 快速排序 < 歸併排序;

穩定性:堆排序和快速排序都是不穩定;

從平均情況下的排序速度角度出發,應該選擇快速排序。 

歸併排序 Merge sort

merge the a s.m and a m 1.t to r s.t template void two merge typet a,typet r,int s,int m,int t while i m r k a i while j t r k a j merge the a 0.n 1 s...

歸併排序(merge sort)

歸併排序 歸併排序是一種遞迴排序演算法,無論陣列元素的原始順序如何,其效能恆定不變。將陣列一分為二,分別排序兩部分元素,再將有序的兩半陣列歸併為乙個有序陣列。歸併步驟比較陣列前一半的元素與陣列的後一半元素,並將較小元素移到臨時陣列,該過程繼續前進,直到其中一半再沒有元素為止。此後只需將其餘元素移到臨...

歸併排序 Merge Sort

歸併排序 merge sort 是利用 歸併 技術來進行排序。歸併是指將若干個已排序的子檔案合併成乙個有序的檔案。兩路歸併演算法 1 演算法基本思路 設兩個有序的子檔案 相當於輸入堆 放在同一向量中相鄰的位置上 r low.m r m 1.high 先將它們合併到乙個區域性的暫存向量r1 相當於輸出...