插入排序
核心:将数组分成两个子集,一个是已排序区域,一个是未排序区域,每一轮从未排序区域中取出第一个元素,插入到已排序区域中(保证顺序)
插入排序基础方法
private static void sort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
// 待排序元素
int temp = arr[i];
// 已排序元素右边界索引(已排序区域最大值)
int j = i - 1;
// 待排序元素于已排序数组中的元素循环比较
while (j >= 0) {
if (temp < arr[j]) {
arr[j + 1] = arr[j];
} else {
break; // 退出循环,减少比较次数
}
j--;
}
arr[j + 1] = temp;
System.out.println(Arrays.toString(arr));
}
}
插入排序和选择排序比较
- 二者平均时间复杂度皆为O(n^2)
- 大部分情况下,插入略优于选择
- 有序集合插入时间复杂度为O(n)
- 插入属于稳定排序算法,而选择属于不稳定排序