数据算法之插入排序

插入排序

文章目录


原理解析:
(这里用升序排序数组举例)

所谓插入排序,顾名思义,从名字上我们就可以知道这种排序算法通过不断的插入数据来排序,那么在一个固定大小的数组中既然有插入数据,那么必然也会有抽出数据。

所谓插入排序,便是以数组一侧作为已排序区域,另一区域为未排序区域,每次从没有排序的数据中抽出一个数据,与已经排序的数据进行比较,将数据插入到合适的位置。

就像我们打扑克牌一样,假设在我们摸牌的时候我们不对手中的扑克牌进行排序,那么最终我们拿到手上的一副牌一定是乱序的,那么这个时候就需要我们从扑克牌的一侧抽出我们的牌,把他插入到已经排好序的一侧扑克牌中,最终完成排序。

对于我们数组中的数据是一样的道理,只要把上述打扑克牌的思路转化为代码就是我们的插入排序,只不过在转化为我们的程序的时候需要对一些细节进行更加的细化。

在将抽出的数据与已经排序好的数据进行比较时. (默认一开始数组中全部都是未排序数据,这里指已经完成部分数据的排序),在没有找到插入位置之前,比插入数据大的已经排好序的数据都要向未排序区域移动一位,以便给插入数据空出位置,当找到比插入数据小的数据时,将插入数据插入到此数据的前一位,以后数据重复此操作完成排序。

代码示例

    //low 未排序区域的左边界,默认初始值为0
    private static void insertSort(int[] a,int low){
        if (low == a.length){//左边界与数组边界重合,说明所有数据全部完成排序
            return;
        }
        int t = a[low];//未排序区域数据
        int i = low - 1;//已排序区域指针
        while (i >= 0 && a[i] > t){
        //结束循环的两种情况
        //1.当i=-1时,结束循环,说明数组中没有已经排好序的区域,可以直接插入。
        //2.找到比插入数据小的位置,且在当前升序数组中找到了插入位置i+1.
            a[i + 1] = a[i];//就是从未排序区域抽出一个数据,而后已排序区域的数据比抽出的数据大的全部右移,给排序数据空出位置
            i --;//继续比较已排序区域的下一个数据;
        }
        //当退出循环说明找到了插入位置
        if(i + 1 != low){ //这里说明位置不用变,则不再进行赋值操作       
        a[i + 1] = t;
        }
        insertSort(a,low +1);//继续将未排序区域进行排序
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值