回顾排序算法之插入排序

插入排序顾明思议就是将目标数插入到已有的有序列表数列中,可能我们本能的会认为是外部数据插入到已有的数据列表中,但是插入排序是可以进行数列内部排序的。核心思想就是将数列里面的字序列当做已排序的有序数列,然后对后面的数据进行比较移动插入操作。

实例:

int[] arr = {22,14,33,21,8};

第一轮把{22}单独当做已经排列好的序列把后面的14插入到这个字序列(i=1):

    14 < 22 所以会将14保存到对应的中间变量中,然后将22后移动一位,想在比较结果之前没数据了,最后将中间变量(14)赋值给22本来的位置

    得到数组{14,22,33,21,8}

第二轮把{14,22}单独当做已经排列好的序列把后面的33插入到这个字序列(i=2):

    33>22 所以什么也不做 得到的结果是{14,22,33,21,8}

第三轮把{14,22,33}单独当做已经排列好的序列把后面的21插入到这个字序列(i=3):

    21<33 所以讲21保存到对应的中间变量中,然后将33后移动一位 得到{14,22,33,33,8}

    21<22 所以将21后移动一位,得到结果是 {14,22,22,33,8}

    21>14 所以不用移动,将中间变量(21)插入到22原来的位置,得到{14,21,22,33,8}

第四轮把{14,21,,22,33}单独当做已经排列好的序列把后面的8插入到这个字序列(i=4):

    8<33 所以讲8保存到对应的中间变量中,然后将33后移动一位 得到{14,21,22,33,33}

    8<22 所以将22后移动一位 得到{14,21,22,22,33}

    8<21 所以将21后移动一位 得到{14,21,21,22,33}

    8<14 所以将14后移动一位 得到{14,14,21,22,33}

    14之前没有数据了,所以将中间变量(8)插入到14原来的位置,得到{8,14,21,22,33}

代码解析:

通过分析得到循环的轮数是按照数组的大小减一判断的

for(int i=1; i<arr.length;i++)

比较的次数是按照目标数据之前的有序目标数列大小决定

for(int j=i-1; j>=0;j--)

综合代码是这样的:

int temp; //存放需要插入的目标数据

int i,j;

//循环轮数

for(i=1; i<arr.length;i++){

    temp = arr[i];

    //移动控制

    for(j=i-1; j>=0;j--){

        if(temp<arr[j]){

            arr[j+1] = arr[j];

        }else{

            break;

        }

    }

    if(arr[j+1] != temp){

        arr[j+1] = temp;

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值