排序之插入排序

1 篇文章 0 订阅

       回头看了一下排序的内容,这边给出一个插入排序的算法实现,一些注意点在代码的注释里面都有写,有的博主的代码存在一些数组越界的错误,这边给予一个更正。
       要不先说一下插入排序的思想吧,直接插入排序的基本操作是将一个记录插入到已经排好的有序表中,从而得到一个新的、记录数增1的有序表。对于给定的一组记录,初始时假定第一个记录自成一个有序序列,其余记录为无序序列。接着从第二个记录开始,按照记录的大小依次将当前处理的记录插入到其之前的有序序列中,直到最后一个记录插到有序序列中为止,说实话,看不懂。
以数组{38,65,97,76,13,27,49}为例,
这里写图片描述
       我们选择38作为有序表的第一个数,第一趟排序如图所示,后面每次将为排序的数往排好的数里面插入,比如第三趟排序,我们选择未排序的数字是97,我们只需找到97在有序表中的位置,插入即可,得到第三趟排序后的结果,如图。
下面是代码

public class InsertSort {
    public static void insertSort(int[] a) {
        int temp;
        int k;
        for (int i = 1; i < a.length; i++) {
            if (a[i] < a[i - 1]) { // 若第i个元素大于i-1元素,即进入下一个循环,该数放的位置就是有序表的最后
                                   //小于的话,需要找到插入位置,即进入if代码块
                int x = a[i]; //x就是我们需要插入的元素
                a[i] = a[i - 1];//这个表示有序表插入一个数后a[i]是当前有序表最大值,其值为a[i];
                int j = i - 1;//j是下面循环的变量,从i-1的位置往前找位置插入
                while (j >= 0 && x < a[j]) { // 查找在有序表的插入位置,x每次和有序表中的元素比较,若小于,继续比较。这里的j>=0为了防止数组越界 -1
                //可以将j>=0删去,在执行代码,看看报错
                    a[j + 1] = a[j];// 元素后移,这里将前一个元素的值赋给后一个
                    j--;
                }
                a[j + 1] = x;//这个位置是找到的位置
            }
        }
        for (int num : a) {
            System.out.println(num);
        }



    }

    public static void main(String args[]) {
        int a[] = { 9, 2, 2, 3, 4, 1, 8, 9 };
        insertSort(a);

    }



}

       建议小伙伴能够在纸上自己从i=1开始演示一下整个过程,就能够容易理解整个算法,特别是其中防止数组越界的条件j>=0,有的博主的代码问题就是出现在这里。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值