排序算法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技术小栈

posted @ 2021-10-09 22:24  工程小白菜  阅读(58)  评论(0编辑  收藏  举报