八種基本的排序(4) 歸併排序(C語言實現)

2021-08-21 15:40:33 字數 2713 閱讀 6342

目錄歸併排序(merge-sort)

歸併操作

演算法描述

比較複雜度

源**>>>我的部落格<<<

是建立在歸併操作上的一種有效的排序演算法1,該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。

歸併操作(merge),也叫歸併演算法,指的是將兩個順序序列合併成乙個順序序列的方法。

如 設有數列(6

,202

,100

,301,38

,8,1

) (6,

202,

100,

301,38,

8,1)

初始狀態:6,

202,

100,

301,38,

8,1 6

,202

,100

,301,38

,8,1

第一次歸併後:(6

,202

) (6,

202)

,(100

,301

) (

100,

301)

,(8,38

) (8,

38)

,(1) (1)

,比較次數:

3 3

; 第二次歸併後:(6

,100

,202

,301

)' role="presentation" style="position: relative;">(6,

100,

202,

301)(6

,100

,202

,301),

(1,8

,38) (1,

8,38)

,比較次數:

4 4

; 第三次歸併後:$1

,6,8

,38,100

,202

,301

)' role="presentation" style="position: relative;">$1,

6,8,

38,100,

202,

301)$1

,6,8

,38,100

,202

,301

),比較次數:

4 4

; 總的比較次數為:3+

4+4=

11' role="presentation" style="position: relative;">3+4

+4=11

3+4+

4=11;

逆序數為

14 14

;歸併操作的工作原理如下:

第一步:申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列

第二步:設定兩個指標,最初位置分別為兩個已經排序序列的起始位置

第三步:比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置

重複步驟3直到某一指標超出序列尾

將另一串行剩下的所有元素直接複製到合併序列尾

歸併排序是穩定的排序.即相等的元素的順序不會改變.如輸入記錄 1(1) 3(2) 2(3) 2(4) 5(5) (括號中是記錄的關鍵字)時輸出的 1(1) 2(3) 2(4) 3(2) 5(5) 中的2 和 2 是按輸入的順序.這對要排序資料報含多個資訊而要按其中的某乙個資訊排序,要求其它資訊盡量按輸入的順序排列時很重要。歸併排序的比較次數小於快速排序的比較次數,移動次數一般多於快速排序的移動次數。

時間複雜度為o(

nlog2n

) o(n

log2⁡n

)這是該演算法中最好、最壞和平均的時間效能。

空間複雜度為o(

n)o (n

)比較操作的次數介於

nlogn2

n

log⁡n2

和nlogn−

n+1 n

log⁡n−

n+1。

賦值操作的次數是(2

nlogn)

( 2n

log⁡n)

。歸併演算法的空間複雜度為:o(

n)o (n

)歸併排序比較占用記憶體,但卻是一種效率高且穩定的演算法。

下面就是源**了

函式版

//歸併排序(從小到大) 

#include

int a[3001000]; //在主函式外定義陣列

int c[3001000];

void merge_sort(int left,int right) //定義歸併函式"merge_sort"

else

}for (;i<=mid;i++) //下面幾個for迴圈把排序好的數記錄下來

for (;j<=right;j++)

for (int ii = left; ii <= right ;ii++)

a[ii] = c[ii - left];

}int main() //主函式

return0;}

//ending

普通版

無 因二分需呼叫自己(遞迴)

不會寫……(尷尬,感覺自己好菜)

排序4 歸併排序

歸併排序 merge sort 完全遵循上述分治法三個步驟 1 分解 將要排序的n個元素的序列分解成兩個具有n 2個元素的子串行 2 解決 使用歸併排序分別遞迴地排序兩個子串行 3 合併 合併兩個已排序的子串行,產生原問題的解。所以說歸併排序一種分治演算法的典型應用。歸併排序過程動態演示 時間複雜度...

排序4 歸併排序

3.海量資料的排序問題 歸併排序 merge sort 是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。歸併排序適合於外部排序,也可以適用於鍊錶排序。外部排序 指的是資料儲存在磁碟上。鍊錶排序 希爾 堆排序 快速排序等均不適...

歸併排序 C語言

今天寫的是歸併排序,歸併排序的定義為 依次將每兩個相鄰的有序表合併成乙個有序表的排序方法。最經常使用的歸併方法是2 路歸併。假設初始序列含有n個記錄,則可看成是n個有序的子串行,每個子串行的長度為1,然後兩兩歸併,得到 n 2 個長度為2或1的有序子串行 再兩兩歸併,如此重複,直至得到乙個長度為n的...