排序三(歸併排序)

2021-07-11 22:23:54 字數 835 閱讀 7997

其實和兩個有序單鏈表的排序有點相似,不斷劃分子區間,然後將每乙個有序的子區間兩兩進行合併(需要借助乙個額外的空間,將合併的區間拷下來),直到最後合成乙個區間,排序就完成了

其實歸併排序也稱外排序(對記憶體可以進行排序,對磁碟也可以進行排序)。例如有這麼乙個題:要求排序100萬個數,這些數無法都載入到記憶體中去,請設計乙個演算法排序這100萬個數。這道題就可以利用歸併排序來解,在磁碟中開闢乙個和原空間一樣大小的空間tmp,然後往記憶體中載入最大限度的元素,然後使用合適的排序演算法進行排序,排好序的序列在原來磁碟的位置上,等都排好序後。在兩兩進行歸併即可,最後乙個歸併的結果可以不拷貝到原來磁碟所在的位置上,可以直接重新命名。

void _mergesort(int arr, int* tmp, int left, int right);//進行區間的劃分

void _merge(int arr, int* tmp, int begin1, int end1, int begin2, int end2);//進行排序

void mergesort(int arr, int size)

void _mergesort(int arr, int* tmp, int left, int right) }}

void _merge(int arr, int* tmp, int begin1, int end1, int begin2, int end2)

else

}while (begin1 <= end1)

while (begin2 <= end2)

}

也可以進行優化,和快速排序的優化很像,其實也可以想快速排序一樣寫出非遞迴版本(利用stack)

排序演算法三歸併排序

歸併排序 merge sort 是利用歸併的思想實現的排序方法,該演算法採用經典的分治 divide and conquer 策略 分治法將問題分 divide 成一些小的問題然後遞迴求解,而治 conquer 的階段則將分的階段得到的各答案 修補 在一起,即分而治之 遞迴 實現 void merg...

排序 歸併排序

歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併 將兩個已經排好序的集合合併到乙個集合眾,並且保證新的集合也是有序的。核心點 只有乙個元素的集合是已經排好序的集合。歸併排序是建立在...

排序 歸併排序

歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。2 路歸併演算法 1.演算法基本思路 設兩個有序的子檔...