直接插入排序介绍

直接插入排序的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。

    怎么理解呢?就是将n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素,排序过程中每次从无序表中取出第一个元素,将其插入到有序表中的指定位置,使之成为一个新的有序表,重复n-1次可完成排序过程。

直接插入排序流程说明

具体流程如下:

  1. 首先比较数组的前两个数据,并排序;
  2. 比较第三个元素与前两个排好序的数据,并将第三个元素放入适当的位置;
  3. 比较第四个元素与前三个排好序的数据,并将第四个元素放入适当的位置;

  4. 直至把最后一个元素放入适当的位置。

代码实现:

public class InsertSort {

	//置换
public void swap(int[] elem, int i, int j) {
int temp = elem[i];
elem[i] = elem[j];
elem[j] = temp;
} public void insertSort(int[] elem) {
int i, j;
for (i = 2; i < elem.length; i++) {
if(elem[i] < elem[i - 1]) { //需要将elem[i]插入到有序子表
elem[0] = elem[i]; //设置哨兵
for (j = i - 1; elem[j] > elem[0]; j--) {
elem[j + 1] = elem[j]; //记录后移
}
elem[j + 1] = elem[0]; //插入到正确位置
}
}
} public static void main(String[] args) {
InsertSort s = new InsertSort();
// int[] elem = {0, 9, 1, 5, 8, 3, 7, 4, 6, 2};
int[] elem2 = {0, 5, 3, 4, 6, 2};
s.insertSort(elem2);
for (int i = 1; i < elem2.length; i++) {
System.out.print(elem2[i] + ", ");
}
}
}

i从2开始的意思是我们假设elem[1]=5已经放好位置,后面的数据元素就是插入到它的左侧还是右侧的问题。

对于初始数据:{5, 3, 4, 6, 2}。

  1. 首先比较5和3的大小,3小,位置互换,第一轮排序后,顺序为:[3, 5, 4, 6, 2]。
  2. 对于第三个数据4,其大于3,小于5,将其插入3和5之间,顺序依旧为:[3, 4, 5, 6, 2]。
  3. 对于第四个数据6,其大于3,4,5,不需要插入,位置不变,顺序为:[3, 4, 5, 6, 2]。
  4. 对于第五个数据2,其小于于3,将其插入到3的前面,顺序为:[2, 3, 4, 5, 6,]。

直接插入排序复杂度分析

从空间上看只需要一个哨兵的辅助空间。

    当最好的情况下,也就是表本身就是有序的,那么我们比较次数共计n-1(∑i=2n\sum_{i=2}^{n}∑i=2n​)次,因为每次都是elem[i]>elem[i -1],所以没有移动记录,时间复杂度为O(n)

    当最坏的情况下,即逆序情况下,此时需要比较(n+2)(n−1)2\frac{(n+2)(n-1)}{2}2(n+2)(n−1)​次,而记录的移动次数也达到最大值(n+4)(n−1)2\frac{(n+4)(n-1)}{2}2(n+4)(n−1)​次

    如果排序记录是随机的,那么根据概率相同的原则,平均比较和移动次数约为n24\frac{n^2}{4}4n2​次。因此我们得出直接插入排序的时间复杂度为O(n2n^2n2)。

    同样的复杂度,直接插入排序比冒泡和简单选择排序性能要好。

直接插入排序实现(Java)的更多相关文章

  1. 直接插入排序之Java实现

    直接插入排序之Java实现 一.方法一 package cn.com.zfc.lesson21.sort; import java.util.Arrays; /** * * @title Insert ...

  2. 排序系列 之 折半插入排序算法 —— Java实现

    基本思想: 折半插入算法是对直接插入排序算法的改进,排序原理同直接插入算法: 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素:排序过程即每次从无序表中 ...

  3. 排序系列 之 直接插入排序算法 —— Java实现

    直接插入排序算法 基本思想: 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素:排序过程即每次从无序表中取出第一个元素,将它插入到有序表中,使之成为新的 ...

  4. 插入排序算法java

    转自https://blog.csdn.net/jianyuerensheng/article/details/51254415 1.基本思想 直接插入排序的基本操作是将一个记录插入到已经排好的有序表 ...

  5. 折半、快排、插入排序的Java实现

    插入排序 import java.util.Arrays; public class InsertionSort { /** * 对数组里面进行插入排序 * 参数1 数组 * 参数2 数组大小 */ ...

  6. 排序算法系列:插入排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)

    在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 我总结一个清晰不罗嗦版: 原理: 和选择排序类似的是也分成“已排序”部分,和“未排 ...

  7. 插入排序(java)

    这星期java老师布置的作业就是实现几种常见的排序算法,由于数据结构学了丢得差不多了,今天晚上搞了一晚上才搞出来插入排序的三种算法. 首先说个与题目不搭的话,今天写

  8. 插入排序 思想 JAVA实现

    已知一个数组 60.28.41.39.6 .18 .14.28.49.31 利用插入排序算法进行排序 插入排序是一个运行时间为O(N²)的排序算法. 算法思想  60.28.41.39.6 .18 . ...

  9. 插入排序算法Java实现

    一. 算法描述 插入即表示将一个新的数据插入到一个有序数组中,并继续保持有序.例如有一个长度为N的无序数组,进行N-1次的插入即能完成排序:第一次,数组第1个数认为是有序的数组,将数组第二个元素插入仅 ...

  10. 直接插入排序(java实现)

    这几天看排序算法,网上大多数排序算法的解释都是“过于专业”,导致一时半会看不明白到底在说什么玩意.现在总结下几大排序算法(java实现) 1.直接插入排序 说的简单点,就是一组无序序列{A1,A2,. ...

随机推荐

  1. OC调用Swift

    Step by step swift integration for Xcode Objc-based project: Create new *.swift file (in Xcode) or a ...

  2. 20155328 2016-2017-2 《Java程序设计》第7周学习总结

    20155328 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 时区 Date与DateFormat Date只用来获取epoch毫秒数 DateForma ...

  3. KBMMW 4.81.00 发布

    这次更新的速度非常快. 4.81.00 May 9 2015 Important notes (changes that may break existing code) ============== ...

  4. hdu-1253(bfs+剪枝)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1253 思路:简单的bfs,就是要注意剪枝. #include<iostream> #inc ...

  5. 带你快速进入.net core的世界(转)

    出处:http://www.cnblogs.com/zhaopei/p/netcore.html 阅读目录 vmware虚拟机安装 CentOS7.3安装 Windows的客户端软件 .NET Cor ...

  6. vivado用法

    声明为”DEBUG”,即使没有连接到其他模块,也不会被优化掉.但并不是所有的信号都是在声明为“debug”属性之后就不会优化掉. (2)同一个bank中能设置一个电平. (3)

  7. OPCache使用示例

    OPcache 有什么用? OPcache 通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销. OPca ...

  8. angular2+ 初理解

    一.Angular Module     1.angular 模块是一个类,它需要NgModule这个装饰器函数接受一个原数据对象作为参数来描述这个模块类属性.     其中最重要的属性有:      ...

  9. DDA_为微分绘制直线算法

    DDA_为微分绘制直线算法 以步进坐标轴部长=1像素为单位,计算y=kx + b,绘制像素点(x, round(y)). 即步进坐标增长1, 另一坐标增长K或者1/k. 程序如下: //数值微分算法D ...

  10. 理解maven项目的pom.xml文件中,<scope>标签的作用——作用域以及依赖传递

    问题介绍: 在maven项目中,最关键的就是pom.xml这个文件,这个文件是用来导入maven项目依赖的jar包以及一些插件等. 在这个文件中导入jar包使用的标签是<dependency&g ...