排序演算法歸納(c語言) 歸併排序

2021-09-23 22:39:50 字數 1676 閱讀 5722

歸併,顧名思義是歸一,合併的意思。

具體的做法大體是:將兩個有序子段歸併為乙個長段,重複這一過程,最終就能得到乙個有序序列了。

所以,縱觀整個對並過程,就像是一顆完全二叉樹。由二叉樹的深度可以得出,整個歸併排序的執行次數是以2為底n的對數。自然,這是乙個對數級的操作。

掃瞄整個整個序列需要耗時o(n),所以,對並排序是乙個時間複雜度為o(nlogn)。

歸併中因為開取了輔助空間,空間複雜度為o(n+logn)。

重要的一點是,歸併排序是一種穩定排序。

總之,歸併排序是一種比較佔記憶體,但效率高且穩定的排序演算法。

待排序資料依然存放於順序表中。

資料存放沒有從0開始,而是選擇從1開始。

**參考於《大話資料結構》。

初始設定

#include

#include

#define maxsize

20//順序表最大容量

#define n

10//表中資料個數

順序表結構體
typedef struct

sqlist;

輸出順序表
void

show

(sqlist l

)printf

("%d\n",l

.data[i]);

}

輸入函式
void

input

(sqlist* lp)

;for

(int i =

0; i <

n; i++

) lp-

>data[i +1]

= d[i]

; lp-

>len =n;

}

遞迴版歸併排序
void

merge

(int sr

, int tr

, int i, int m, int n)

if(i <= m)

//將剩餘的sr[i..m]複製到tr

if(j <= n)

//將剩餘的sr[j..n]複製到tr

}

void

msort

(int sr

, int tr1

, int s, int t)

}

void

mergesort_recursion

(sqlist* lp)

優化版歸併排序

其中merge函式同上

void

mergepass

(int sr

, int tr

, int s, int n)

if(i < n - s +1)

merge(sr

,tr, i, i + s -

1, n)

;else

for(j = i; j <= n; j++)tr

[j]=

sr[j]

;}

void

mergesort_iteration

(sqlist* lp)

}

系列鏈結

C語言歸併排序

描述 給定乙個數列,用歸併排序演算法把它排成公升序。輸入 第一行是乙個整數n n不大於10000 表示要排序的數的個數 下面一行是用空格隔開的n個整數。輸出 輸出排序後的數列,每個數字佔一行。歸併排序有兩個關鍵點 1.將兩個已經排好序的序列進行合併。歸併2個有序序列為1個有序序列 void merg...

C語言 歸併排序

歸併是將兩個或多個存序記錄序列合併成乙個有序序列。一般來說,一次對幾個有序記錄進行歸併,就稱為幾路歸併排序。以二路歸併排序為例,其基本方法如下 1 將 n 個記錄看成是 n 個長度為 1 的有序子表。2 將兩兩相鄰時有序序列進行歸併。3 重複執行步驟 2 直到歸併成乙個長度為 n 的有序表 如下所示...

C語言歸併排序

include include description 歸併排序 author qingq datetime 2021年3月8日20點03分 int length 待排序陣列長度 int a 待排序陣列 int b 輔助陣列b void mergesort int a,int low,int hig...