插入排序

  • 插入排序介绍
  • 插入排序图文介绍
  • 插入排序的时间复杂度和稳定性
    • 插入排序时间复杂度
    • 接插入排序稳定性
  • 插入排序实现

插入排序介绍

插入排序基本思想是:把 n 个待排序的元素看成为一个有序表和一个无序表。开始时有序表中只包含 1 个元素,无序表中包含有 n-1 个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复 n-1 次可完成排序过程。

在插入排序中,为了要给插入的元素腾出空间,我们需要将其余所有元素在插入之前都向右移动一位。

与选择排序一样,当前索引左边的所有元素都是有序的,但它们的最终位置还不确定,为了给更小的元素腾出空间,它们可能会被移动。但是当索引达到数组的右端时,数组排序就完成了。

和选择排序不同的是,插入排序所需的时间取决于输入中元素的初始顺序。例如,对一个很大且其中的元素已经有序(或接近有序)的数组进行排序将会比对随机顺序的数组或是逆序数组进行排序要快得多。

插入排序图文介绍

下面选取直接插入排序的一个中间过程对其进行说明。假设 {20, 30, 40, 10, 60, 50} 中的前 3 个数已经排列过,是有序的了;接下来对10进行排列。示意图如下:

图中将数列分为有序区和无序区。我们需要做的工作只有两个:

  1. 取出无序区中的第1个数,并找出它在有序区对应的位置。
  2. 将无序区的数据插入到有序区;若有必要的话,则对有序区中的相关数据进行移位。

插入排序的时间复杂度和稳定性

插入排序时间复杂度

插入排序的时间复杂度O(N^2)
假设被排序的数列中有 N 个数。遍历一趟的时间复杂度是O(N),需要遍历多少次呢?N-1!因此,直接插入排序的时间复杂度是O(N^2)。

接插入排序稳定性

直接插入排序是稳定的算法,它满足稳定算法的定义。
算法稳定性:假设在数列中存在 a[i] = a[j] ,若在排序之前,a[i] 在 a[j] 前面;并且排序之后,a[i] 仍然在 a[j] 前面,则这个排序算法是稳定的。

插入排序实现

public class InsertionSort {/*** 判断元素m是否小于n*/private static boolean less(Comparable m, Comparable n){return m.compareTo(n) < 0;}/*** 交换数组中两个元素*/private static void exchange(Comparable[] a, int i, int j){Comparable temp = a[i];a[i] = a[j];a[j] = temp;}/*** 判断数组是否成功排序* */private static boolean isSorted(Comparable[] a){for (int i = 1 ; i < a.length ; i++ ){if (less(a[i], a[i-1])){return false;}}return true;}/*** 展示数组元素* */public static void show(Comparable [] a){for (int i = 0 ; i < a.length ; i++ ){System.out.print(a[i] + " ");}System.out.println();}/*** 插入排序算法* */public static void sort(Comparable [] a){for (int i = 1 ; i < a.length ; i++){ // 从a[1]开始,设a[0]为已排序for(int j = i ; j>0 && (less(a[j], a[j-1]) ) ; j--){ //exchange(a, j, j-1);}}}}

测试案例1:

public static void main(String[] args) {Comparable[] a = new Comparable[40];for (int i = 0 ; i < a.length ; i++){a[i] = new Random().nextInt(1000);}System.out.println("排序前:");show(a);System.out.println("插入排序:");sort(a);show(a);System.out.println("是否排序成功:" + isSorted(a));
}

运行效果:

排序前:
8 817 833 500 150 535 729 245 485 59 312 220 247 998 760 961 945 532 389 822 512 632 744 684 461 737 871 653 449 562 180 645 83 916 499 981 15 178 714 351
插入排序:
8 15 59 83 150 178 180 220 245 247 312 351 389 449 461 485 499 500 512 532 535 562 632 645 653 684 714 729 737 744 760 817 822 833 871 916 945 961 981 998
是否排序成功:true

测试案例2:

public static void main(String[] args) {Comparable[] a = {"S","O","R","T","E","X","A","M","L","E"};System.out.println("排序前:");show(a);System.out.println("插入排序:");sort(a);show(a);System.out.println("是否排序成功:" + isSorted(a));
}

运行效果:

排序前:
S O R T E X A M L E
插入排序:
A E E L M O R S T X
是否排序成功:true

《Algorithms》Comparable 实现插入排序相关推荐

  1. Algorithms - Insertion Sort - 插入排序

    1 Insertion Sort - 插入排序 2 插入排序算法的 '时间复杂度' 是输入规模的二次函数, 深度抽象后表示为, n 的二次方. 3 4 import time, random 5 F ...

  2. java青蛙过河打字_趣味算法——青蛙过河(JAVA)

    青蛙过河是一个非常有趣的智力游戏,其大意如下: 一条河之间有若干个石块间隔,有两队青蛙在过河,每队有3只青蛙,这些青蛙只能向前移动,不能向后移动,且一次只能有一只青蛙向前移动.在移动过程中,青蛙可以向 ...

  3. 《Algorithms》Comparable 实现排序大全

    各种排序 这篇文章是将所有排序写到了一起..方便复习. 各个排序的单独介绍戳下面: 选择排序 插入排序 冒泡排序 希尔排序 归并排序 快速排序 慢慢补全... 各排序算法时间比较(代码) public ...

  4. 《Algorithms》Comparable 实现希尔排序

    希尔排序 希尔排序介绍 希尔排序图文说明 希尔排序的时间复杂度和稳定性 希尔排序时间复杂度 希尔排序稳定性 希尔排序实现 希尔排序介绍 希尔排序其实是改进版的插入排序,我们先回忆一下插入排序,插入排序 ...

  5. 《Algorithms》Comparable 实现快速排序三向切分的快速排序

    快速排序 快速排序的切分 完整的快速排序 三向切分的快速排序(快排的改进版) 快速排序是目前使用最广泛的排序,同时也是目前最快的排序,它也体现了分治的思想:将数组分成两部分,并分别独立地进行排序,和归 ...

  6. 《Algorithms》Comparable 实现冒泡排序

    冒泡排序 冒泡排序实际上就是进行 a.length 轮循环,每轮会将最大的元素放到右边(已经排好元素的左边). 由于冒泡排序比较简单,不多说了,展示下示例与代码即可. 下面以数列{20,40,30,1 ...

  7. 《Algorithms》Comparable 实现归并排序

    Comparable 实现归并排序 原地归并的抽象方法 自上而下的归并排序 从下往上的归并排序 参考文章的地址:http://www.cnblogs.com/skywang12345/p/360236 ...

  8. 《Algorithms》Comparable 实现选择排序

    选择排序 选择排序介绍 选择排序图文 选择排序的时间复杂度和稳定性 选择排序时间复杂度 选择排序稳定性 选择排序实现 代码中涉及到 Comparable 的部分将会在别的文章单独介绍. 选择排序介绍 ...

  9. 排序---初级排序算法(选择排序、插入排序和希尔排序)

    写在前面的话: 一枚自学Java和算法的工科妹子. 算法学习书目:算法(第四版) Robert Sedgewick 算法视频教程:Coursera  Algorithms Part1&2 本文 ...

最新文章

  1. post请求中的序列化
  2. 这个AI模型用最少的训练数据学习对象之间的关系
  3. 汇编语言--call 指令
  4. vivado环境下实现比较器
  5. 关于linux的服务器搭建,关于搭建linux日志服务器
  6. 消息映射的服务器的设计与实现
  7. 有效使用计算机操作系统,有效地使用计算机操作系统.doc
  8. MapReduce框架在Yarn上的具体解释
  9. 语文到底要不要补课?
  10. 电脑刷机重装系统_一键刷机工具
  11. 求连续区间和为目标值的一种解题思路
  12. 一文了解 操作系统发展史
  13. COMSOL光学仿真——非线性光学
  14. c++中文件打开失败
  15. http://www.jobui.com/mianshiti/it/java/6782/
  16. 客户端到服务器端的通信过程及原理
  17. 设置Win10防火墙规则,使得局域网能访问此电脑的Tomcat服务器
  18. php下载列表如何实现,phpcms v9 列表页直接下载功能代码实现
  19. mysql mha etcd_postgresql 高可用 etcd + patroni 之四 failover
  20. [matlab笔记]多元函数泰勒展开

热门文章

  1. 创业过程中一定会引进纯资金投资人
  2. 在公司具备这三个条件,就准备好跳槽吧
  3. Traditional industries like notebook computers seem
  4. 详解 Solidity 事件Event
  5. 二叉树的层次遍历II
  6. iptables: Resource temporarily unavailable.问题
  7. alwayson高可用组_了解AlwaysOn可用性组上的备份-第1部分
  8. 如何让li中内容超出部分显示为...?
  9. js将手机号中间四位变成*号
  10. 前台js获取url传递参数(后台Request.QueryString接收)