直接插入排序將數組分為「已排序區」與「未排序區」,初始已排序區僅含首元素。每次從未排序區取首元素,在已排序區從右向左掃描,將大於該元素的值右移,騰出空位插入,時間複雜度 O(n²),穩定排序。
public class Swapper {
public static > void swap(int i, int j, T[] array) {
T tmp = array[i]; array[i] = array[j]; array[j] = tmp;
}
public static void swap(int i, int j, int[] array) { ... }
}
InsertionSortord.getInstance()doSort(int...) 基礎類型版與 doSortT(T[]) 泛型版vacancy 記錄空位索引for (int i = 1; i < length; i++) {
if (array[i] < array[i-1]) {
int sentry = array[i];
int vacancy = i;
for (int j = i-1; j >= 0; j--) {
if (array[j] > sentry) {
array[j+1] = array[j];
vacancy = j;
}
}
array[vacancy] = sentry;
}
}
int[] arr = {3,5,4,2,6};
insertSort.doSort(arr); // 基礎類型
Integer[] arr2 = {3,5,4,2,6};
insertSort.doSortT(arr2); // 泛型
| 指標 | 值 |
|---|---|
| 時間複雜度 | 最好 O(n),最差/平均 O(n²) |
| 空間複雜度 | O(1) |
| 穩定性 | 穩定 |
| 適用場景 | 小規模數據、近乎有序數組、教學演示 |