【排序】圖解插入排序
阿新 • • 發佈:2018-11-29
一、思想
插入排序的工作方式像許多人排序一手撲克牌,開始時,我們的左手為空並且桌子上的牌面朝下。然後,我們每次從桌子上拿走一張牌並將它插入左手中正確的的位置,從右到左將它與已在手中的每張牌進行比較,選擇正確位置進行插入,這樣,當桌子上的牌全部插入到手中,手中的撲克牌則是所有撲克牌的已排序狀態。
二、圖解過程
三、核心程式碼
//插入排序演算法
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)
未藉助其它輔助空間。