目录

一、简介

二、排序思路

三、算法实现

四、原理分析


一、简介

插入排序,就是假定一个参考值,假设该参考值左边的元素都有序,那么从该元素开始从后往前挨个查找,如果找到比参考值大的数,那么就将这个大的数后移,如果未找到比参考值大的数,说明不用移动元素。循环比较,经过比较后移之后就会空出一个位置,用于存放这个参考值。

插入排序对于基本有序的数组最好用,另外插入排序也比较稳定。插入排序有点像于往前的冒泡排序算法。

二、排序思路

排序思路:(假设从小到大)

  • 【1】 待排序数组: 5, 6, 3, 7, 2, 1
  • 【2】第一趟:从第二个元素开始,参考值指向第二个元素6,假设6左面的元素 5 为有序的,从5开始,6和5比较,因为 6 > 5,没有找到比6大的数,因此不用右移,于是第一趟结果为: 5,6,3,7,2,1;
  • 【3】第二趟:参考值指向第三个元素3,经过第一趟排序3左边的元素 5,6 已经有序,从3开始从后往前挨个比较,3 < 6,将6往后移,3 < 5,将5也往后移,这时候空出第一个位置用于填充参考值3,于是第二趟排序结果为: 3,5,6,7,2,1;
  • 【4】第三趟:参考值指向第四个元素7,经过第二趟排序后7左边的元素 3,5,6 已经有序,从7开始从后往前挨个比较,7 > 6,7 > 5, 7 > 3,没有找到比7大的数,因此不用右移,于是第三趟结果为: 3,5,6,7,2,1;
  • 【5】第四趟: 参考值指向第五个元素2,经过第三趟排序后2左边的元素 3,5,6,7 已经有序,从2开始从后往前挨个比较, 2 < 7,将7往后移, 2 < 6,将6也往后移; 2 < 5,将5往后移,2 < 3 ,将3也往后移,这时空出第一个位置用于填充参考值2,于是第四趟结果为: 2,3,5,6,7,1;
  • 【6】第五趟:参考值指向第六个元素1,经过第三趟排序后1左边的元素 2,3,5,6,7 已经有序,从1开始从后往前挨个比较, 1 < 7,将7往后移,1 < 6,将6也往后移,1 < 5,将5往后移,1 < 3,将3也往后移,1 < 2 ,将2也往后移,这时候空出第一个位置用于填充参考值1,于是第五趟结果为:1,2,3,5,6,7;
  • 【7】元素已经有序,排序完毕;

三、算法实现

/*** @Description: 插入排序工具类* @Author: weishihuai* @Date: 2018/10/16 21:31* <p>* 原理:* 1、从第二个元素开始循环遍历,作为参考值,认定参考值左边的元素都有序。* 2、取出参考值的下一个元素,在已经排序的元素序列中从后向前扫描。* 3、如果该元素(已排序)大于新元素,则将该元素移到下一位置。* 4、重复步骤3,直到找到已排序的元素小于新元素的位置。* 5、将新元素插入到该位置。* 6、重复步骤2。*/
public class InsertSortUtils {public static int[] sort(int[] array) {//从第二个元素开始遍历即可for (int i = 1; i < array.length; i++) {    //外层循环相当于抽出第i张牌来//参考值int temp = array[i];//从参考值前面一个元素开始从后往前查找int j = i - 1;for (; j >= 0; j--) {   //内层循环相当于将第i张牌插入到前面已经有序的数组中去//假如找到比参考值大,数据往后移if (array[j] > temp) {array[j + 1] = array[j];} else {// 跳出循环break;}}array[j + 1] = temp;System.out.println("第" + i + "趟排序后:" + Arrays.toString(array));}return array;}
}

测试:

public class Test {public static void main(String[] args) {int[] array = {5, 6, 3, 7, 2, 1};System.out.println("排序前: " + Arrays.toString(array));int[] arr = InsertSortUtils.sort(array);System.out.println("排序后: " + Arrays.toString(arr));}}

测试结果:

四、原理分析

下图是对插入排序算法每一步排序的理解以及交换思路:

插入排序,没有利用额外的空间,所以空间复杂度是O(1),时间复杂度为O(n²),最好情况下的时间复杂度为O(n)。插入排序比冒泡排序效率高的多,比较和交换的次数都比冒泡排序少的多。

以上就是关于排序算法的一些总结以及思路,希望对大家有所帮助。

常见排序算法之插入排序相关推荐

  1. Java常见排序算法之插入排序

    一.概述 本节由小千给大家分享Java常见排序算法之插入排序,之前我们说过排序是算法中的一部分.所以我们学习排序也是算法的入门,为了能让大家感受到排序是算法的一部分,我举个例子证明一下:比如麻将游戏, ...

  2. 希尔排序的详细过程_算法系列: 10大常见排序算法(4)希尔排序

    本课程是从少年编程网转载的课程,目标是向中学生详细介绍计算机比赛涉及的编程语言,数据结构和算法.编程学习最好使用计算机,请登陆 www.3dian14.org (免费注册,免费学习). 一句 希尔排序 ...

  3. 常见排序算法详解(插入排序、希尔排序、选择排序、冒泡排序、快速排序)

    1.1 插入排序 步骤: 1.从第一个元素开始,该元素可以认为已经被排序 2.取下一个元素tem,从已排序的元素序列从后往前扫描 3.如果该元素大于tem,则将该元素移到下一位 4.重复步骤3,直到找 ...

  4. php常见排序算去,PHP兑现常见排序算法

    PHP实现常见排序算法 //插入排序(一维数组) function insert_sort($arr){ $count = count($arr); for($i=1; $i $tmp = $arr[ ...

  5. android studio插入数据表中没有_学Java能拿高薪吗 Java中常见排序算法有哪些

    学Java能拿高薪吗?Java中常见排序算法有哪些?作为老牌编程语言,Java拥有广阔的市场占有率,几乎90%以上的大中型互联网应用系统在服务端开发都会首选Java.为了加入到Java这一高薪行业,很 ...

  6. python实现常见排序算法

    python实现常见排序算法 快速排序 思想:取出第一个元素把它放到序列的中间某一个正确位置,以它进行分割成左边和右边,再分别对左边和右边进行取元素分割(递归) 递归实现 def quicksort( ...

  7. 插入排序 php,常用的排序算法(二)--插入排序(PHP实现)

    常用的排序算法系列 插入排序 插入排序是一种逻辑上非常好理解的排序方式,整个排序的核心就是不断在当前已经排好部分数据的数组里,找到合适的位置插入新数据.就像抓扑克牌,抓一张,然后再手里已经部分已经排好 ...

  8. php 面试靠快速排序,搞定PHP面试 - 常见排序算法及PHP实现

    常见排序算法及PHP实现全文代码使用PHP7.2语法编写 0. 五种基础排序算法对比 1. 冒泡排序(Bubble Sort) 冒泡排序 是一种交换排序,它的基本思想是:对待排序记录从后往前(逆序)进 ...

  9. python常见排序算法解析

    python--常见排序算法解析 算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法,分 ...

  10. 常见排序算法的原理与实现(js)

    常见排序算法通常需要通过比较来确定次序(比较类排序):由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序. 各类排序算法的特点: 术语解释: 时间复杂度:对排序数据的总的操作次数 ...

最新文章

  1. 转发一份GoldenGate 配置文档,里面有参数说明,值得看
  2. 逆向工程核心原理学习笔记(十三):分析abex' crackme #1 的延伸:将参数压入栈
  3. 音视频技术开发周刊 | 169
  4. html点击按钮执行php代码,php代码在html文件里面执行的示例
  5. 420集的python教程下载_阿里达摩院推荐的420集的python教程,据说懂中文就能入门高清版...
  6. 今天对网站的JAVA面试题部分进行了重新整理
  7. codeforces 598C C. Nearest vectors(极角排序)
  8. Python数据科学库-小测验
  9. Java8 实战系列-05-lambda 类型推断
  10. css实现数字钟表字体实现 fonts
  11. Linux ALSA声卡驱动
  12. unity 安装遇到问题
  13. 无法定位程序输入点K32Get Module File Name Ex于动态链接库KERNEL32.dll上 的错误解析
  14. 记一次新旧系统数据迁移
  15. HTML5期末大作业:动漫电网站设计——动漫电影《你的名字》(7页) HTML+CSS大作业: 动漫电网页制作作业_动漫电网页设计...
  16. 数据结构排序之“九阳神功”
  17. bcd 初始化库系统卷失败_中级|软考题库每日一练|2.24
  18. 常用外贸群发邮件模板,海外邮件
  19. 基于Java的文本相似度计算
  20. 人工智能融入售后服务 实现精准售后备件需求预测

热门文章

  1. 容器技术Docker K8s 30 容器服务ACK基础与进阶-弹性伸缩
  2. Swift 5 Dictionary用法大全
  3. 拉起客户端 Universal Links Scheme Open App iOS(Deep Link)
  4. 2021-09-07LFM(latent factor model)
  5. linux下安装xgboost
  6. 罗马仕php30重量,认真测评 篇三:罗马仕sence8P+两年使用报告
  7. mysql5.7主从恢复_MySQL 5.7 开启主从同步开启GTID恢复数据
  8. pcb板可挖孔吗_PCB板上的过孔的种类及打孔注意事项
  9. 【NLP】揭秘马尔可夫模型神秘面纱系列文章(二)
  10. 【博弈 —— NIM模型】