《資料結構與演算法》之排序演算法(歸併排序)

2021-08-31 11:17:33 字數 1853 閱讀 1882

5、歸併排序

歸併排序(merge-sort)是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。其時間複雜度為o(nlogn),空間複雜度為o(n),是穩定的排序演算法。

歸併排序演算法的工作原理如下:

(1)把長度為n的輸入序列分成兩個長度為n/2的子串行;

(2)對這兩個子串行分別採用歸併排序;

(3)將兩個排序好的子串行合併成乙個最終的排序序列。

下面是乙個二路歸併排序的簡單程式:

此圖借鑑於:

public class mergesort ;

system.out.println("未排序陣列順序為:");

display(array);

mergesort(array, 0, array.length - 1);

system.out.println("經過排序後的陣列順序為:");

display(array);

} // 遍歷顯示陣列

public static void display(int array)

system.out.println();

} // 歸併排序演算法

private static void mergesort(int a, int left, int right)

// 對每一次排序後的陣列進行歸併

private static void merge(int a, int left, int mid, int right)

// 將左邊剩餘的歸併

while (left <= mid)

// 將右邊剩餘的歸併

while (r1 <= right)

system.out.print("第" + (++number) + "趟排序: ");

// todo auto-generated method stub

// 從臨時陣列拷貝到原陣列

while (cindex <= right)

system.out.println();

}}

歸併排序比較占用記憶體,但卻是一種效率高且穩定的演算法。改進歸併排序在歸併時先判斷前段序列的最大值與後段序列最小值的關係再確定是否進行複製比較。如果前段序列的最大值小於等於後段序列最小值,則說明序列可以直接形成一段有序序列不需要再歸併,反之則需要。所以在序列本身有序的情況下時間複雜度可以降至o(n)。

timsort可以說是歸併排序的終極優化版本,主要思想就是檢測序列中的天然有序子段(若檢測到嚴格降序子段則翻轉序列為公升序子段)。在最好情況下無論公升序還是降序都可以使時間複雜度降至為o(n),具有很強的自適應性。

最好時間複雜度

最壞時間複雜度

平均時間複雜度

空間複雜度

穩定性傳統歸併排序

o(nlogn)

o(nlogn)

o(nlogn)

o(n)

穩定改進歸併排序

o(n)

o(nlogn)

o(nlogn)

o(n)

穩定timesort

o(n)

o(nlogn)

o(nlogn)

o(n)穩定

注:關於 歸併排序的改進演算法和timesort演算法後續還要新增。

資料結構與演算法之歸併排序

歸併排序 merge sort 是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列 即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。歸併過程為 比...

資料結構與演算法之PHP排序演算法(歸併排序)

一 基本思想 歸併排序演算法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,使每個子串行有序,再將已有序的子串行合併,得到完全有序的序列。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。二 演算法過程 歸併主要做兩件事 1 分解 將...

資料結構與演算法之排序演算法(四) 歸併排序

歸併排序 分治思想的運用 原理 將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的,然後再把有序的子串行合併為整天有序序列。分治演算法步驟 第一步 劃分。將原問題劃分為幾個子問題 第二步 遞迴求解。遞迴求解每個子問題 第三步 合併。將求解後的子問題合併...