資料結構 排序之歸併排序

2021-10-12 13:56:03 字數 1252 閱讀 1738

歸併,即「遞迴合併」。

q:我們排序的目的是什麼?

a:讓無序的序列變得有序。

比如說,下面有乙個序列:

排序前排序後

7654321

1234567

如果我們將這個序列從中間附近分開,分成兩個子串行,想辦法讓這兩個子串行變得有序。然後再把兩個有序的子串行合併成乙個有序的子串行,那麼我們的排序不就完成了嗎?

如下圖:

這樣乙個大的任務被分成了兩個子任務:對兩個子串行進行排序

排序前排序後

7654

4567

321123

很容易發現,這兩個子任務和原來的任務沒有本質區別,只是規模變得更小了。可以對這兩個子任務再次進行拆分,在**實現上,這就是遞迴的操作。

乙個基本事實:當序列中只有乙個元素時,它是乙個有序的序列

有了這個基本事實,不難想出:只要經過足夠多次數的分割,一定會將序列分成只有乙個元素的序列,這就是遞迴的出口。

如此,可以給出歸併排序主體思想的**:

這個**十分簡潔:

void

mergesort

(int arr,

int start,

int end,

int temp)

//傳入的引數:待排序陣列,起始下標,終止下標,輔助陣列temp

那麼,如何進行合併的操作呢?

用兩個下標(i,j),分別指向兩個有序序列的起始點,再用乙個下標(k),指向輔助陣列temp的相應位置。

比較i和j對應元素的大小,因為是要排成乙個遞增的序列,選取較小的賦值給temp[k],再將這個下標和k都加1。

當兩個序列都走完後,將temp中的元素複製回待排序的陣列。

歸併排序是個穩定的排序演算法,穩定性由上述操作保證。

下面給出合併操作的**實現:

void

merge

(int arr,

int start ,

int mid,

int end,

int temp)

將合併的**放在排序**之前,就能執行了。

歸併排序是乙個時間複雜度為線性對數階的排序演算法,時間複雜度為:o(n*log2n)(以2為底n的對數),要占用至少n個元素的輔助空間。

資料結構之排序 歸併排序

四 歸併排序 歸併 把若干個有序的數列,合成乙個有序的數列 如二路歸併 void merge int d1,int len1,int d2,int len2,int tmp while i len1 tmp k d1 i while j len2 tmp k d2 j 1,二路歸併排序 迭代法 把待...

資料結構之歸併排序

介紹 歸併排序是建立在歸併操作上的一種有效的排序演算法,效率為o nlogn 歸併排序的實現分為遞迴實現與非遞迴 迭代 實現。遞迴實現的歸併排序是演算法設計中分治策略的典型應用,我們將乙個大問題分割成小問題分別解決,然後用所有小問題的答案來解決整個大問題。非遞迴 迭代 實現的歸併排序首先進行是兩兩歸...

資料結構之歸併排序

編寫乙個歸併排序程式,並在main函式中驗證結果 歸併排序 merging sort 是利用 歸併 技術進行排序,所謂歸併 是指將若干個已排序好的子表合併成乙個有序表 最簡單的歸併是將兩個有序的子表合併成乙個有序表。假設r low 到r mid 和r mid 1 到r high 是儲存在同乙個陣列中...