插入排序
算法描述
-
将数组分为两个区域,排序区域和未排序区域,每一轮从未排序区域中取出第一个元素,插入到排序区域(需保证顺序)
-
重复以上步骤,直到整个数组有序
最坏时间复杂度:O(n²)
稳定性:稳定
算法实现
public static void insert(int[] nums) {
// i 代表待插入元素的索引
for (int i = 1; i < nums.length; i++) {
// 代表待插入的元素值
int value = nums[i];
//已排序区域索引
int j = i-1;
while (j >= 0) {
if (value < nums[j]) {
//使用移动代替交换,减少移动次数
nums[j +1] = nums[j];
} else {
break;//退出循环,减少比较的次数
}
j--;
}
nums[j+1] = value;
}
}
与选择排序比较
-
二者平均时间复杂度都是 O ( n 2 ) O(n^2) O(n2)
-
大部分情况下,插入都略优于选择
-
有序集合插入的时间复杂度为 O ( n ) O(n) O(n)
-
插入属于稳定排序算法,而选择属于不稳定排序