直接插入排序

直接插入排序

原理

直接插入排序(straight insertion sort)的作法是:

每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。

第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。

直接插入排序属于稳定的排序,最坏时间复杂性O(n^2)空间复杂度O(1)

直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较的数值。内层循环为待比较数值确定其最终位置。直接插入排序是将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数值置入其后一位置,结束该次循环。

值得注意的是,我们必需用一个存储空间来保存当前待比较的数值,因为当一趟比较完成时,我们要将待比较数值置入比它小的数值的后一位 插入排序类似玩牌时整理手中纸牌的过程。插入排序的基本方法是:每步将一个待排序的记录按其关键字的大小插到前面已经排序的序列中的适当位置,直到全部记录插入完毕为止。

实例

package com.mylearn.algorithm.sort;

import org.apache.commons.lang.xwork.StringUtils;

/**

 * Created by IntelliJ IDEA.

 * User: yingkuohao

 * Date: 13-9-9

 * Time: 下午1:46

 * CopyRight:360buy

 * Descrption: 插入排序,相当于把数组分成了两部分,前边是已排序好的,后边是未排序的,拿到目标值去往前面已排好的序列里插入,

 * 倒叙对比,发现有比目标值大的就往后移位,直至发现比目标值小的,把空余的位置填入目标值。 时间复杂度:n*n

 * To change this template use File | Settings | File Templates.

 */

public class InsertSort {

    public static void main(String args[]) {

        Integer[] integers = new Integer[]{12, 15, 9, 24, 6, 31};

        InsertSort insertSort = new InsertSort();

        System.out.println("初始:" + StringUtils.join(integers, ","));

        insertSort.execute(integers);

        System.out.println("结果:" + StringUtils.join(integers, ","));

    }

    public void execute(Integer[] integers) {

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

            //循环目标,拿到当前值

            int tmp = integers[i];

            int j = i;

            //获取当前的角标,从后往前遍历,如果有比目标值大的就后移,即j-1的值移到j上,最后留一个空位,把tmp的值赋上即可。

            while(j>0&&integers[j-1]>tmp) {

                integers[j] = integers[j-1];

                j--;

            }

             integers[j] = tmp;

        }

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值