【演算法導論】歸併排序
標籤(空格分隔):【演算法導論】
什麼是排序?
考慮對於給定輸入的某乙個陣列 a
=a = \
a=, 經過排序演算法,我們可以得到原始排列的乙個序列a
=a=\, a_2^,..., a_n^\}
a=, 其中ai′
+1′a_i^ < a_^
ai′
+1′
.什麼是遞迴?
演算法一次或多次地呼叫自身來解決問題。
什麼是分治?
將原問題分解為幾個規模較小,但類似於原問題的子問題,遞迴地解決這些子問題並建立原問題的解。
在每層遞迴時,分治模式包含三步驟:1. 分解;2. 解決;3. 合併。
什麼是歸併排序?
歸併排序演算法遵循分治模式,其操作如下:1 分解:將待排序的 n 個元素序列分解成兩個長度為 n/2 的子串行;2. 解決:使用歸併排序遞迴地排序兩個子串行;3. 合併:將兩個已排序的子串行合併為乙個序列。
為了直觀起見,我們用圖例介紹歸併排序,對於陣列 a = [5, 2, 4, 7, 1, 3, 2, 6] 有:
上圖中展示了分解與歸併的過程。
我們來看歸併過程是如何實現的。
首先要搞清楚,歸併過程是將連續存放的兩個有序陣列合併為乙個有序陣列。
對於兩個已經有序的陣列,設定兩個指標i, j, 分別指向兩個陣列的頭部元素,選擇二者中較小的乙個元素放入臨時陣列中,隨後指標向後移動,直到移動到末尾,此時,只需要將另外乙個未結束的陣列移動到臨時陣列中即可。
為直觀起見,我們用圖例展示歸併過程,以陣列 a = [2, 4, 5, 7, 1, 2, 3, 6] 為例,
下面給出歸併排序的**:
void merge( vector& a, int low, int mid, int high)
void merge_sort( vector& a, int low, int high)
}//在main函式中輸入的引數為 merge_sort( a, 0, a.size() - 1);演算法分析:
對於歸併排序演算法的時間複雜度,我們可以列出其遞迴式:
t (n
)=c & n=1 \\ 2t(n/2) + cn & n >1 \end \right.
t(n)={
c2t(
n/2)
+cn
n=1n
>1
改遞迴式的解法至少有三中,此處不再討論。
易得,其時間複雜度為o(n
logn
)o(nlogn)
o(nlog
n), 空間複雜度為o(n
演算法導論 歸併排序
public class mergesort mergesort data,0,中間 mergesort data,中間,最後 merge data,0,最後 system.out.println 排序前 for int i 0 i9 i 10 0 system.out.println system...
演算法導論 歸併排序
演算法的設計有很多思想,之前的插入排序使用的是增量的方法,即在排好的子陣列a中,將元素a j 插入,形成新的子陣列a。這次將實現另一種排序 歸併排序,歸併排序採用了 分治法 divide and conquer 本篇中包含 分治法,也可以稱為分治策略 是將乙個大規模的問題 原問題 劃分成n個規模較小...
演算法導論 歸併排序
歸併排序的步驟分為三個 將問題分解為更小的問題,然後解決小問題,將小問題合併為大問題的解。針對歸併排序的主要思想是 將乙個需要排序的陣列一分為二,然後將這兩部分進行單獨排序,然後將這兩個排好序的子數組合然後按照順序合併為大陣列。還有乙個就是邊界問題,將陣列無限的分下去知道最後的子陣列只剩乙個元素的時...