排序算法之插入排序

思路:插入排序很像我们打扑克时候的整理牌!抓到一张新牌就把他放到合适的位置!

首先第一步,我们先把第一个元素看成已经排好序的序列,我们还是用具体序列来看

8,3,4,9,7                (直接将8看成有序的)

第一步,将8看成有序的,那么我们应当是从第二个数开始(也就是3开始),来找他合适的位置,3<8 那么3应该放到8的前面

3,8,4,9,7                (第一趟排好,那么3,8为有序序列,后面的为无序序列)

好的,接下来,我们从无序序列里抓到一张新牌——4,拿去和前面已经整理好的牌比较。4<8,那么再往前比较,4>3,所以4应当放在3,8之间

3,4,8,9,7                (第二趟)

循环操作 这次9比8还大,所以不用比较了

3,4,8,9,7                (第三趟)

最后一张牌再去比较,7应当在8,9之间

3,4,7,8,9                (第四趟)

由此可见,排序5个数,进行4趟,那么n个数,n-1趟(外层for循环)

代码实现思路:首先我们要进行n-1次排序 而且我们默认了第一个数为有序的,所以外层for循环从1开始(对应得数组就是第二个数)到最后一个数,然后将当前数和前面的数进行比较,首先要判断是不是比前面得数小,如果小,才要进行插入,如果大,那么就证明当前已经是有序序列。

代码实现

public class InsertSort {
    public void insert(int[] t,int n) {
        int min;
        /*这里用1 因为第一个数,也就是t[0] 已经是有序的*/
        for (int i = 1; i < n; i++) {
            /*取当前这个数*/
            min = t[i];
            /*如果当前这个数 小于前面的那个数,才进行插入!
            (因为前面是已经从小到大排好的序列,
            如果当前数已经大于之前的最后一个数字。
            那么就不用排了呀!)*/
            if(t[i] < t[i-1]) {
                /*那么就是将当前这个数,和之前一位开始的数字进行比较,
                至于min为什么要小于之的数字t[j]是因为,如果出现了小于min的数,
                那就证明找到min的位置了,
                参考3,8 用4去插入 出现了3比4小,所以4应当放在3的后面
                所以如果出现小于比较的数字,那么就不用比了
                就可以停止循环,因为已经找到位置了*/
                for (int j = i-1;j >= 0&&min < t[j];j--) {
                /*
                * 找到以后,将已经比较过的数字后移一位
                * 因为我们最开始的那个要比较的数字已经保存到min中了,
                * 所以不用担心覆盖的问题。
                * 然后将要比较的数字放入到当前位置
                * */
                    t[j+1] = t[j];
                    t[j] = min;
                }
            }
        }
    }
}

插入排序的动图(出自:1.3 插入排序 | 菜鸟教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值