插入排序將數組分為「已排序區」與「未排序區」。初始時已排序區僅含首個元素,每次從未排序區取出首個元素,在已排序區中從後向前掃描,找到插入位置並移動元素騰出空間,完成插入。重複直到未排序區為空。
public class InsertionSort {
public static void sort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int key = arr[i];
int j = i - 1;
// 將大於 key 的元素右移
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key; // 插入
}
}
// 二分查找優化版(僅減少比較次數,移動次數不變)
public static void binaryInsertionSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int key = arr[i];
int left = 0, right = i - 1;
// 二分查找插入位置
while (left <= right) {
int mid = (left + right) >>> 1;
if (arr[mid] > key) right = mid - 1;
else left = mid + 1;
}
// 移動元素
for (int j = i - 1; j >= left; j--) {
arr[j + 1] = arr[j];
}
arr[left] = key;
}
}
}
key 保存待插入值。key 的元素右移一位。實際工程中,對於小數組(如長度 < 50),插入排序常比快速排序更快,因無遞歸開銷且緩存友好。Java Arrays.sort() 對小數組即採用雙軸快速排序配合插入排序優化。