歸併排序(Merge Sort)
阿新 • • 發佈:2021-09-19
歸併排序是基於歸併操作的一種穩定排序演算法,並且也是分治思想的一個典型的應用。在穩定的排序過程下,它可以達到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++]; }
如有不對敬請指出,感謝閱讀!