博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
直接插入排序
阅读量:2494 次
发布时间:2019-05-11

本文共 1497 字,大约阅读时间需要 4 分钟。

直接插入排序

原理

直接插入排序(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;

        }

    }

}

转载地址:http://kzrrb.baihongyu.com/

你可能感兴趣的文章
JPA多条件动态查询
查看>>
JPA自定义sql
查看>>
BigDecimal正确使用了吗?
查看>>
joplin笔记
查看>>
JNDI+springmvc使用
查看>>
vue+springboot分页交互
查看>>
vue+springboot打包发布
查看>>
XSL 开发总结
查看>>
beta阶段第六次scrum meeting
查看>>
SpringBoot+MybatisPlus实现批量添加的两种方式
查看>>
vue 设计结构
查看>>
Sqlerver2005+按照ID分组取前几条
查看>>
Python的编码和解码
查看>>
docker
查看>>
停车场系统安全岛设计施工要求
查看>>
Docker实战
查看>>
asp.net core结合Gitlab-CI实现自动化部署
查看>>
RDIFramework.NET ━ .NET快速信息化系统开发框架 V2.7 版本发布
查看>>
EasyNVR H5无插件摄像机直播解决方案前端解析之:关于直播页面和视频列表页面切换的问题...
查看>>
django搭建一个小型的服务器运维网站-拿来即用的bootstrap模板
查看>>