歸併排序 C語言實現

2021-10-10 16:58:31 字數 1906 閱讀 3375

( merging sort )就是將兩個或兩個以上的有序表合併成一-個有序表的過程。將兩個有序表合併成個有序表的過程稱為2-路歸併,2-路歸併最為簡單和常用。

演算法思想:

假設初始序列含有n個記錄,則可看成是n個有序的子串行,每個子串行的長度為1,然後兩兩歸併,得到[n/2]個長度為2或1的有序子串行;再兩兩歸併,……,如此重複,直至得到乙個長度為1的有序序列為止。

書上的例子:

時間複雜度

o(nlog

2log_2

log2​n)

空間複雜度

o(n)

演算法特點:

1)是穩定排序。

2)可用於鏈式結構,且不需要附加儲存空間,但遞迴實現時仍需要開闢相應的遞迴工作棧。

完整**:

#include

#include

#include

#define maxsize 100

//順序表最大容量,可以自行加大

typedef

struct

elemtype;

//記錄型別

typedef

struct

sqlist;

//順序表

void

initlist

(sqlist &l)

//順序表的初始化

void

createlist

(sqlist &l)

//順序表的建立

scanf

("%d"

,&l.data[l.length]

.key)

;//順序表資料的輸入 if(

getchar()

=='\n'

)//迴圈終止條件

break;}

}void

inputlist

(sqlist l)

//順序表的輸出

printf

("列印為:");

for(i=

1;i<=l.length;i++

)//利用迴圈列印順序表中的資料

printf

("%d "

,l.data[i]

.key);}

void

merge

(elemtype r,

int low,

int mid,

int high)

//將兩個有序表r[low…mid]和r[mid+1…high]歸併為有序表

while

(i<=mid)

//將剩餘的t[i…mid]複製到r中

r[k++

]= t[i++];

while

(j<=high)

//將剩餘的t[j…high]複製到r中

r[k++

]= t[j++];

}void

msort

(elemtype r,

int low,

int high)

//利用遞迴將r[low…high]歸併排序

}void

mergesort

(sqlist &l)

//對順序表l做歸併排序

(完)

C語言實現歸併排序

歸併排序 時間複雜度 o nlogn 空間複雜度 o n 穩定性 穩定 實現原理 採用分治法 divide and conquer 將已有序的子串行合併,得到完全有序的序列,即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,也叫二路歸併。實現 採用遞迴方法實現 include...

C語言實現歸併排序

歸併排序演算法完全遵循分治模式 偽 對分組歸併 merge a,p,q,r n1 q p 1 n2 r q let l 1.n1 1 and r 1.n2 1 be new arrays for i 1 to n1 l i a p i 1 for j 1 to n2 r j a q j l n1 1...

歸併排序的C語言實現

歸併排序的核心思想是 divide and conquer 演算法,即將要解決的size為n的問題,分成a個size為n b的子問題,這些子問題的結果經過o n d 的時間複雜度合併,即可解決最初的問題。所以,這一類的演算法,複雜度計算公式為 t n a t n b o n b 經過幾天的努力,終於...