1. 程式人生 > 其它 >歸併排序(Merge Sort)

歸併排序(Merge Sort)

  歸併排序是基於歸併操作的一種穩定排序演算法,並且也是分治思想的一個典型的應用。在穩定的排序過程下,它可以達到O(n * log(n))的時間複雜度,但是該演算法需要依賴一個O(n)的輔助排序空間。

  歸併排序演算法的主要思想為,給出排序區間,將區間等分為兩份,並且分別對兩個區間進行排序,待兩個區間排序完畢,使用O(n)的貪心的方法合併這兩個有序區間。其中劃分的過程最多佔用O(log(n))的時間複雜度,每次劃分均需要進行一次合併,即達到上述O(n * log(n))的時間複雜度。歸併過程也可以稱為二路歸併。

  通過上面對於演算法的表述,可以看出排序可以非常簡單的使用一個遞迴來實現,下面給出其程式碼。

void mergeSort(int *arr, int *temp, const int &start, const int &end) {
    int mid;
    if (start < end) {
        mid = (start + end) / 2;
        mergeSort(arr, temp, start, mid);
        mergeSort(arr, temp, mid + 1, end);
        merge(arr, temp, start, mid, end);
    }
}

  通過在合理區間內不斷的劃分,使得目標區間越來越小,在O(log(n))的時間內對目標序列進行劃分,然後對所得兩區間進行O(n)的合併操作。最終合併為一個完整的有序序列。

  下面給出合併程式碼。

void merge(int *arr, int *temp, const int &start, const int &mid, const int &end) {
    for (int i = start; i <= end; ++i) {
        temp[i] = arr[i];
    }
    int i = start;
    int j = mid + 1;
    int k = start;
    while (i < mid + 1 && j < end + 1) {
        if (temp[i] < temp[j]) arr[k++] = temp[i++];
        else arr[k++] = temp[j++];
    }
    while (i < mid + 1) arr[k++] = temp[i++];
    while (j < end + 1) arr[k++] = temp[j++];
}

  如有不對敬請指出,感謝閱讀!