排序算法之--插入排序

一、简介

        插入排序是一种简单直观的排序算法,‌它的工作原理是通过构建有序序列,‌该算法适用于少量数据的排序。‌在插入排序中,‌每一个元素都会插入到已经排序的序列中,‌通过比较和移动元素来达到排序的目的。‌

二、算法思路分析

        插入排序的关键在于:要理解何为插入,现有一随机数组arr = [4,7,5,3,6],对其进行排序。首先忘掉这是一个数组,扑克牌大家都玩过吧,以扑克牌举例,假设扑克牌的排序从左至右依次变大
第一手: 取到:4,手中就一张牌,结束
第二手: 取到:7,当前手中牌:【4】,对比: 4 < 7 直接4右边,结束
第三手: 取到:5,当前手中牌:【4、7】,对比: 7 > 5,7向右移动一位,给左边留个插牌的位 置,再对比:4 < 5,插到4的右一位。
在这里插入图片描述

第四手: 取到:3,当前手中牌:【4、5、7】,对比:7 > 3,7向右移动一位,给左边留个插牌的位置,再对比:5 》3,5向右移一位(7后移留下的位置),给左边留个插牌的位置,再对比:4>3,4向右移一位,4左边没牌了那就放在最左边。
在这里插入图片描述

第五手: 取到:6,当前手中牌【3、4、5、7】,对比:7 》6, 7向右移动一位,给左边留个插牌的位置,再对比:5 < 6,插到5的右一位。
至此手中的扑克牌变成【3、4、5、6、7】

在这里插入图片描述

三、算法复杂度分析:

3.1、时间复杂度方面:

        最好情况时间复杂度:‌当待排序序列已经是有序时,‌每次插入一个元素只需要进行一次比较即可确定其位置,‌因此最好情况下的时间复杂度为O(n)。‌
        最坏情况时间复杂度:‌当待排序序列是逆序的,‌即每个元素都比前一个元素大,‌这时每次插入一个元素需要进行多次比较才能找到正确的位置,‌最坏情况下的时间复杂度为O(n^2)。‌
        平均情况时间复杂度:‌由于插入排序在最好和最坏情况下的时间复杂度分别对应于序列已有序和序列完全逆序的情况,‌因此在实际应用中,‌其平均时间复杂度也是O(n^2)。‌

3.2、空间复杂度方面:

        插入排序是一种就地排序算法,‌它不需要额外的存储空间来排序数据,‌因此其空间复杂度为O(1)。‌这意味着它在处理数据时不会占用额外的存储空间,‌非常适合处理数据量较小的情况。‌

四、代码实现:

    public static void insertSort(int[] pokerArr) {
        for ( int i = 1; i < pokerArr.length; i++ ) {
            //当前取到的牌
            int newPoker = pokerArr[i];
            int j = i - 1;
            //与手中牌对比,确定插入位置
            while ( j >= 0 && pokerArr[j] > newPoker ) {
                //手中第j张牌 > 当前取的牌 当第j张牌右移一位
                pokerArr[j + 1] = pokerArr[j];
                //再对比左边的牌,直到左边无牌、或者左边牌 < 当前取的牌,结束
                j--;
            }
            //将牌插入最终位置
            pokerArr[j+1] = newPoker;
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浪子城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值