1. 程式人生 > >【排序】圖解歸併排序

【排序】圖解歸併排序

一、思想

歸併排序是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法的一個非常典型的應用。主要的思想為「分而治之」,將大問題化解成一個個的小問題,逐個求解,最後將這些結果組合到一起。

二、圖解過程

三、核心程式碼

//歸併排序
public static void mergeSort(int[] arr) {
	if (arr == null || arr.length < 2) {
		return;
	}
	mergeSort(arr, 0, arr.length - 1);
}
//分治
public static void mergeSort(
int[] arr, int l, int r) { if (l == r) { return; } int mid = l + ((r - l) >> 1); mergeSort(arr, l, mid); mergeSort(arr, mid + 1, r); merge(arr, l, mid, r); } //合併 public static void merge(int[] arr, int l, int m, int r) { int[] help = new int[r - l + 1]; int i = 0; int p1 = l; int p2 =
m + 1; while (p1 <= m && p2 <= r) { help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++]; } while (p1 <= m) { help[i++] = arr[p1++]; } while (p2 <= r) { help[i++] = arr[p2++]; } for (i = 0; i < help.length; i++) { arr[l + i] = help[i]; } }

四、複雜度分析

1、時間複雜度:O(NlogN)

每次合併的操作時間複雜度為 O(N),完全二叉樹深度為 log2N。最好、最壞、平均時間複雜度為均為 O(NlogN)

2、額外空間複雜度:O(N)

合併時藉助了一個數組進行外排。

完整原始碼