歸併排序 Merge Sort 的遞迴與非遞迴實現

2021-09-12 06:49:30 字數 2009 閱讀 3565

歸併排序採用分治的策略,是乙個穩定排序演算法。其基本思想是:將待排序的序列劃分為長度大致相同的兩個子串行,對兩個子串行分別進行歸併排序,即對子序列進行相同規則的劃分與排序,直到子串行的長度為1,最終將排好序的子串行合併成排好序的序列。

歸併排序具體有兩種實現方式:遞迴的與非遞迴的,亦稱為從上往下的與從下往上的。

遞迴實現

思路:1)將長度為n的待排序序列arr[0:n](左閉右開)一分為二,即取序列中點mid = left + (right-left)/2,將序列分為arr[0:mid]與arr[mid:n]兩個子串行

2)對兩個子串行執行1)中的操作,直到分出的子串行長度為1

3)將劃分的兩個子串行合併,即得到排好序的序列

void merge(int arr, int left, int mid, int right)

for(k = left; k < right; ++k)

arr[k] = temparr[k-left];

delete temparr;

}void mergesort(int arr, int left, int right)

void _merge(int* a, int* t, int left, int mid, int right)  else 

}for (int i = left; i < right; ++i)

}void _mergesort(int* a, int* t, int left, int right)

int mid = left + ((right-left)>>1);

_mergesort(a, t, left, mid);

_mergesort(a, t, mid, right);

_merge(a, t, left, mid, right);

}void mergesort(int* a, int left, int right)

非遞迴實現非遞迴實現與遞迴實現相反,從長度為1的子串行開始排序,將它們兩兩合併,然後依次對長度為2、2^2、2^3...的序列進行排序與合併,直到完成所有數的排序。

而非遞迴實現中,有另一種做法,稱為自然歸併排序。事實上,對於給定的陣列,通常存在多個長度大於1的已自然排好序的子串行段,如中,, , , 就是四個已自然排好序的子串行段,可通過o(n)的遍歷找出,將相鄰的已自然排好序的子串行段兩兩合併,初次合併後繼續兩兩合併已合併過一次的子串行段,直到整個陣列都排好序。

這裡實現的是一般的非遞迴實現

#include #define ll long long

#define inf 0x3f3f3f3f

using namespace std;

void merge(int arr, int left, int mid, int right)

for(k = left; k < right; ++k)

arr[k] = temparr[k-left];

delete temparr;

}void mergehelp(int arr, int step, int len)

if(i+step < len) //如果剩下的數比step還多,就再進行一次merge

merge(arr, i, i+step, len);

}void mergesort(int arr, int len)

}int main()

; mergesort(a, n);

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

cout << a[i] << ' ';

return 0;

}

歸併排序每次將資料規模減半,且每次除去遞迴所需要做的操作的複雜度顯然為o(n),那麼有

根據主定理,有t(n) = ω(nlogn)。

歸併排序 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 相當於輸出...