
直接插入排序如同整理扑克牌的智慧:
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;
// 在已排序区寻找插入位置
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j]; // 右移比key大的元素
j--;
}
arr[j + 1] = key; // 插入到正确位置
}
}
public static void main(String[] args) {
int[] data = {12, 11, 13, 5, 6};
sort(data);
System.out.println(Arrays.toString(data)); // [5, 6, 11, 12, 13]
}
}指标 | 数值 | 说明 |
|---|---|---|
时间复杂度 | 平均O(n²) | 双重循环结构 |
最优O(n) | 输入已排序时 | |
空间复杂度 | O(1) | 原地排序 |
核心优势:
Arrays.sort()在子数组长度<47时自动切换插入排序
行业案例:
新手必练:
// 降序版本(仅需修改比较条件)
while (j >= 0 && arr[j] < key) { // 将>改为<
arr[j + 1] = arr[j];
j--;
}高手进阶:
// 二分插入排序优化
private static int binarySearch(int[] arr, int key, int low, int high) {
while (low <= high) {
int mid = low + (high - low)/2;
if (arr[mid] < key) low = mid + 1;
else high = mid - 1;
}
return low;
}
// 在插入步骤中使用二分查找确定位置
int pos = binarySearch(arr, key, 0, i-1);直接插入排序教会我们:
当你能在3分钟内向非技术人员讲明白这个算法时,说明真正掌握了用生活案例解释抽象概念的能力——这是算法工程师的核心软实力。记住:好的算法不仅要高效,更要具备可解释性。