1. 程式人生 > >【排序】圖解插入排序

【排序】圖解插入排序

一、思想

插入排序的工作方式像許多人排序一手撲克牌,開始時,我們的左手為空並且桌子上的牌面朝下。然後,我們每次從桌子上拿走一張牌並將它插入左手中正確的的位置,從右到左將它與已在手中的每張牌進行比較,選擇正確位置進行插入,這樣,當桌子上的牌全部插入到手中,手中的撲克牌則是所有撲克牌的已排序狀態。

二、圖解過程

插入排序

三、核心程式碼

//插入排序演算法
public static void insertionSort(int[] arr) {
	//不滿足交換條件
	if (arr == null || arr.length < 2) {
		return;
	}
	for
(int i = 1; i < arr.length; i++) { for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) { swap(arr, j, j + 1); } } } //交換陣列中的兩個元素 public static void swap(int[] arr, int i, int j) { int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; }

四、複雜度分析

1、時間複雜度:O(N^2)

最壞的情況是待排序陣列完全逆序,也就是每一次插入都要和有序集合中的所有元素進行比較,插入第二個元素時需要與前1個元素進行比較,插入第3個元素時,需要與前2個元素比較,以此類推,插入前N個元素需要與前N-1個元素比較。1 + 2 + 3 + ... + (N-1)

,結果為(N-1)*N/2,即O(N^2)

最好的情況是待排序陣列已經是有序的了,每插入一個元素只需要和前一個元素進行比較,複雜度為O(N)

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

未藉助其它輔助空間。

完整原始碼