歸併,顧名思義是歸一,合併的意思。
具體的做法大體是:將兩個有序子段歸併為乙個長段,重複這一過程,最終就能得到乙個有序序列了。
所以,縱觀整個對並過程,就像是一顆完全二叉樹。由二叉樹的深度可以得出,整個歸併排序的執行次數是以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...