【排序演算法】:歸併排序
阿新 • • 發佈:2019-02-14
介紹
歸併排序(MERGE-SORT)是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱為二路歸併。
歸併過程為:比較a[i]和b[j]的大小,若a[i]≤b[j],則將第一個有序表中的元素a[i]複製到r[k]中,並令i和k分別加上1;否則將第二個有序表中的元素b[j]複製到r[k]中,並令j和k分別加上1,如此迴圈下去,直到其中一個有序表取完,然後再將另一個有序表中剩餘的元素複製到r中從下標k到下標t的單元。歸併排序的演算法我們通常用遞迴實現,先把待排序區間[s,t]以中點二分,接著把左邊子區間排序,再把右邊子區間排序,最後把左區間和右區間用一次歸併操作合併成有序的區間[s,t]。
時間複雜度:O(n * log n);
空間複雜度:O(n);
穩定性:穩定;
程式碼實現
void _MergeSort(int* src, int* dst, int left, int right)
{
if (left >= right)
return;
int mid = left + (right - left) / 2;
//[left,mid],[mid+1,right],歸併前有序
_MergeSort(src,dst, left, mid);
_MergeSort(src,dst, mid+1,right);
int begin1 = left; int begin2 = mid + 1;
int index = 0;
while (begin1 <= mid && begin2 <= right)
{
if (src[begin1] < src[begin2])
dst[index++] = src[begin1++];
else
dst[index++] = src[begin2++];
}
while (begin1 <= mid)
dst[index ++] = src[begin1++];
while (begin2 < right)
dst[index++] = src[begin2++];
int i = 0; int j = left;
while (i < index)
src[j++] = dst[i++];
}
void MergeSort(int* a, int n)
{
assert(a);
int* tmp = new int[n];
_MergeSort(a, tmp, 0, n - 1);
}