插入排序是一個簡單的排序算法,一次排序一項構建最終的有序數組。在大列表排序上相比於更先進的算法例如快速排序、堆排序、歸併排序就不那麼有效了。然而,插入排序有如下優點:
- 簡單實現:Jon Bentley 展示了一個 3 行代碼的 C 版本和一個 5 行代碼的優化版本。
- 對小數據集有效,非常像其他平方排序算法。
- 在實踐中比其他平方算法例如選擇排序、冒泡排序更有效。
- 自適應:對已經排序的數據集有效:時間複雜度是 O(kn) 當輸入的每一個元素從它排序的位置起不超過 k 個位置。
- 穩定的:不改變相同元素的相對位置。
- 在原來位置的:只要求常數數量 O(1) 的額外存儲空間。
- 在線的:當它接收一個列表的時候就可以排序。
其實,我們打撲克牌時的摸牌階段就很像插入排序。
下面給幾個插入排序的模板:
模板一:
public void insertionSort(int[] nums) {
for (int i = 1; i < nums.length; ++i) {
for (int j = i - 1; j >= 0; --j) {
if (nums[j] > nums[j + 1]) {
int tmp = nums[j + 1];
nums[j + 1] = nums[j];
nums[j + 1] = tmp;
}
}
}
}
模板二:
public void insertionSort(int[] nums) {
for (int i = 1; i < nums.length; ++i) {
int tmp = nums[i];
int j = i - 1;
while (j >= 0 && nums[j] > tmp) {
nums[j + 1] = nums[j];
--j;
}
nums[j + 1] = tmp;
}
}