歸併排序採用分治的策略,是乙個穩定排序演算法。其基本思想是:將待排序的序列劃分為長度大致相同的兩個子串行,對兩個子串行分別進行歸併排序,即對子序列進行相同規則的劃分與排序,直到子串行的長度為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 相當於輸出...