演算法導論 歸併排序

2021-09-25 21:13:05 字數 1602 閱讀 6308

【演算法導論】歸併排序

標籤(空格分隔):【演算法導論】

什麼是排序?

考慮對於給定輸入的某乙個陣列 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個規模較小...

演算法導論 歸併排序

歸併排序的步驟分為三個 將問題分解為更小的問題,然後解決小問題,將小問題合併為大問題的解。針對歸併排序的主要思想是 將乙個需要排序的陣列一分為二,然後將這兩部分進行單獨排序,然後將這兩個排好序的子數組合然後按照順序合併為大陣列。還有乙個就是邊界問題,將陣列無限的分下去知道最後的子陣列只剩乙個元素的時...