插入排序原理(java实现)

  插入排序也是排序算法的一种,他的排序定义是这样:把一个数插入到一个有序数列的合理位置,并使插入后数列仍然有序,不断重复这个过程,就能使整个数组成为有序数列。
  
  听起来很难理解,对吧,不如我们举个例子,假定一个整型数组{7,5,6,4,3,1,2},对他进行从小到大的排序,按照定义说的,把一个数插入到一个有序数列的合理位置,什么是有序数列呢,哪里来的有序数列呢,本来就是让变得有序,原来就有序那还用排序吗?博主刚开始也是很不理解为什么这么定义,后来才慢慢明白其中的道理
  
  比如上面说的这个数组,我们应该怎么看,首先看下标0和下标1位置中的数,7和5,先让他俩从小到大排好,5比7小,那就让5放到7的前面,于是就变成了{5,7,6,4,3,1,2},现在,前两个数就是定义中说的有序数列了,对于刚刚比较的7和5来说,7这个数,就是定义中说的有序数列,好,我们完成剩余的过程
  
  再来看下标2,首先让他和下标1进行比较,6比7小,那么将7放到6的位置,拿6去跟下标0,也就是5,比较,6比5大,所以6应该放在5后面,下标1的位置,数组变成{5,6,7,4,3,1,2},看到这里读者可能不明白了,为什么开始的时候就将7放到6的位置,别急,接着往下看
  
  看下标3,让他跟前一个数,下标2,也就是7比较,4比7小,那7往后移,放到4的位置,再拿4和下标1的数据进行比较,4比6小,那么6往后移,再拿4和下标0的数据进行比较,4比5小,那么5往后移,这时候,前面没有数据了,那么4就放到了下标0的位置,数组变成{4,5,6,7,3,1,2}
  
  后面的操作也是一样,依次把下标4,下标5,下标6中的数据拿出来跟前面的数进行比较,如果前面的数大,就让他往后移一个位置,直到前面的数不大于要插入的数了,再将其插入,看到这儿,你明白刚刚说的将7放到6的位置是为什么了吗?因为这个数据结构是数组,你要插入,就必须将各个元素往后移,才能空出位置,但是,要注意的是,往后移的同时,会产生数据覆盖,就比如第一轮说的7放到6的位置,那6就没了,所以怎么办?再定义一个整型变量target去保存这个数,防止数据覆盖,读者可以参照上面的例子和下面的代码,自己走一走步骤,就明白了
  
  下面是Java代码实现:
  

//插入排序原理
class Demo
{
    public static void main(String[] args)
    {
        //定义整形数组
        int[] arr = {2,1,3,5,7,6,4};
        //调用插入排序函数
        InsertSort(arr);
        //输出排序后的数组
        for(int i=0;i<arr.length;i++)
        {
            System.out.print(arr[i]+"  ");
        }
    }
    //定义插入排序函数
    public static void InsertSort(int[] arr)
    {
        for(int i=1;i<arr.length;i++)
        {
            //将要比较的值赋值给target,否则将被覆盖,无法找到
            int target = arr[i];
            //定义j来控制下标
            int j = i;
            //当满足j>0并且target<arr[j-1]的时候,循环
            while(j>0 && target<arr[j-1])
            {
                //满足target<arr[j-1]就把数组向后移
                arr[j] = arr[j-1];
                j--;
            }
            //循环结束后,j就是要插入的位置,将target赋值给arr[j]
            arr[j] = target;
        }
    }
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值