排序算法之插入排序

插入排序是一种基于有序的排序,打个比方,我们在玩扑克牌的时候,每一次摸牌的时候就直接把牌插入到对应的位置,而不需要将其他牌再牌序,这就是插入排序,数字越有序,速度越快,所以我们经常把插入排序用于其他排序的优化

注意:这里图解有误,是tmp的值比 j 的值小,把j的值放在 j+1 的位置上,我这里写错了

 这里简单解释一下上图,首先我们定义一个 i 下标为数组的第二个元素,j 下标为 下标的前一个元素,j 每次减减,然后和tmp比较

那么如何正确的写一个插入排序呢?请看下面代码

public static void insertsotr(int[] array){
        for (int i = 1; i < array.length; i++) {
            int tmp = array[i];
            int j = i-1;
            for (; j >= 0 ; j--) {
                if(array[j]>tmp){
                    array[j+1] = array[j];
                } else {
                    break;
                }
            }
            array[j+1] = tmp;
        }
    }
  • 时间复杂度:

    • 最坏情况(O(N^2)): 当输入数组完全逆序时,每次插入操作几乎都需要移动已排序序列中的所有元素。因此,总的比较和移动次数接近于n(n-1)/2,即O(N^2)。
    • 最好情况(O(N)): 当输入数组已经是排序状态时,插入排序只需进行n-1次比较(无需移动),因此时间复杂度为O(N)。
    • 平均情况(O(N^2)): 对于随机排列的数据,插入排序的平均时间复杂度也是O(N^2)。
  • 空间复杂度(O(1)): 插入排序是一种原地排序算法,除了输入数组外,仅需常数级别的额外空间(用于交换和临时变量),因此其空间复杂度为O(1),非常节省内存。

  • 稳定性:插入排序是稳定的排序算法。这意味着相等的元素在排序前后相对顺序不变。这是因为插入排序是通过在已排序序列中找到合适的位置插入元素,而不是像选择排序那样交换位置。

  • 适用场景:插入排序特别适合于小规模数据集或接近于有序的数据集。对于近乎有序的数据,插入排序的性能非常好,因为它可以减少元素的移动次数。此外,由于其简单和原地排序的特性,它也常被用作更复杂排序算法(如快速排序)中的基础排序步骤,尤其是在分治策略中处理小数组时。

总的来说,插入排序因其简单、稳定和空间效率高的特点,在特定场景下是非常实用的排序算法。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值