目錄歸併排序(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
log2n
)這是該演算法中最好、最壞和平均的時間效能。
空間複雜度為o(
n)o (n
)比較操作的次數介於
nlogn2
n
logn2
和nlogn−
n+1 n
logn−
n+1。
賦值操作的次數是(2
nlogn)
( 2n
logn)
。歸併演算法的空間複雜度為: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的...