1. 程式人生 > >【排序演算法】:歸併排序

【排序演算法】:歸併排序

介紹

歸併排序(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); }