排序算法3 - 插入排序
排序算法3 - 插入排序
算法思路
目前第 0 位到第 0 位已经有序,而第 0 位到第 n -1 位想要有序
将第 1 位的数与前面的数进行比较,插入到合适的位置,此时第 0 位到第 1 位变得有序
将第 2 位的数与前面的数进行比较,插入到合适的位置,此时第 0 位到第 2 位变得有序
以此类推,直到所有元素均排序完毕
代码实现
public void insertionSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = i + 1; j >= 0; j--) {// 将第 i+1 位的数依次与前面的数进行比较
if (arr[j] - 1 > arr[j]) { // 如果前面的数比较大,则进行交换
swap(arr, j - 1, j); // 交换 j-1 和 j 位的值
} else { // 如果前面的数不大于第 i+1 位的数,
break; // 则表明已经插到了正确的位置,可以结束此轮排序,进行下一轮的排序
}
}
}
}
private void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
复杂度分析
1. 时间复杂度
插入排序最好的情况就是数组元素本身就有序,这是最优的情况,每一个数只需和前面的元素比较一次即可,所以时间复杂度为 O(n)
最坏的情况就是数组是逆序的,此时时间复杂度为 O(n²)
而时间复杂度 O( ) 是按最坏情况估计,是最差情况下的指标,所以插入排序的时间复杂度为 O(n²)
2. 空间复杂度
不占用额外的内存空间,即空间复杂度为常数阶 O(1)
欢迎大家来我博客逛逛 mmimo技术小栈