插入排序將數組分為「已排序區」與「未排序區」。初始已排序區僅含首元素。每次從未排序區取出首元素,在已排序區從右向左比較、移位,找到插入位置並放入。類似整理撲克牌。
| 指標 | 複雜度 | 說明 |
|---|---|---|
| 最佳時間 | O(n) | 數組已有序,內層循環不執行 |
| 最壞時間 | O(n²) | 數組逆序,每次插入需遍歷整個已排序區 |
| 平均時間 | O(n²) | |
| 空間複雜度 | O(1) | 原地排序 |
| 穩定性 | 穩定 | 相等元素不交換順序 |
import java.util.Arrays;
public class InsertionSorting {
public static void main(String[] args) {
int[] nums = {4, 3, -1, 9, 2, 1, 8, 0, 6};
System.out.println("排序前: " + Arrays.toString(nums));
for (int i = 1; i < nums.length; i++) {
int key = nums[i];
int j = i - 1;
// 從右向左查找插入位置,同時右移元素
while (j >= 0 && nums[j] > key) {
nums[j + 1] = nums[j];
j--;
}
nums[j + 1] = key;
}
System.out.println("排序後: " + Arrays.toString(nums));
}
}
j >= 0 && nums[j] > key 同時保證不越界與找到 ≤ key 的位置。插入排序代碼極簡、穩定、適應性強(有序時 O(n)),是工程中小數據排序的首選,也是理解高級排序算法的基石。