排序系列【比较排序系列之】直接插入排序
最近在和小伙伴们一起研究排序,排序分好多总,后期会做整体总结,本篇则主要对插入排序进行一个整理。
插入排序(insert sorting)的算法思想十分简单,就是对待排序的记录逐个进行处理,每个新纪录与同组那些已排好序的记录进行比较,然后插入到适当的位置。用三个字总结就是—-“多对一”的关系。
插入排序分好几种,比如二分插入排序,交换插入排序,直接插入排序,本篇我们重点总结最熟悉的“直接插入排序”。
比如有一个数组【45 34 78 12 34’ 32 29 64】,我们针对此进行一下讲解。
排序过程 数组{45 34 78 12 34’ 32 29 64} |
---|
第一遍 45和34比较,34<45,所以排序完成为34 45 78 12 34’ 32 29 64 |
第二遍 78和34 45比较 78>45 78>34,所以位置不变,排序完为 34 45 78 12 34’ 32 29 64 |
第三遍 12和34 45 78比较 12<78 左移+1,12<45 左移+2,12<34 左移+3,排序完为 12 34 45 78 34’ 32 29 64 |
第四遍 34’ 左移+2 排序完 12 34 34’ 45 78 32 29 64 |
第五遍 32 左移+4 排序完 12 32 34 34’ 45 78 29 64 |
第六遍 29 左移+6 排序完 12 29 32 34 34’ 45 78 64 |
第七遍 64 左移+1 排序完 12 29 32 34 34’ 45 64 78 |
用代码实现的话其实更简单,引入一个临时变量,具体看代码:
public static void main(String[] args) {Test2 test2 = new Test2();//定义一个数组int[] array = {45, 34, 78, 12, 34, 32 ,29 ,64};test2.insertSort(array);System.out.println(Arrays.toString(array));}void insertSort(int[] array) {//定义的临时变量int tempRecord;//i从1开始的原因是j=j-1for (int i = 1; i < array.length; i++) {tempRecord = array[i];int j = i - 1;//j不能为负数,根据索引判定值大小,通过临时变量进行交换while (j >= 0 && tempRecord < array[j]) {array[j + 1] = array[j];j = j - 1;}array[j + 1] = tempRecord;}}
2018年07月30日14:30:55补充:
array[j + 1] = tempRecord,应该放入while循环内,因为若tempRecore不小于array[j],则此次i循环则直接结束。
通过代码我们来看一下时间复杂度和空间复杂度。
因为我们只引入了一个辅助存放插入记录的临时变量,因此空间代价为一个记录大小 及O(1);
当数据正序时,如上我们口述的排序比较过程,执行效率最好,每次插入都不用移动前面的元素,有N个元素参与比较,时间复杂度为O(N)。
当数据反序时,则执行效率最差,每次插入都要前面的元素后移,
i=1时,移动2-1;
i=2时,移动3-1;
当i=n时,移动n-1;
求和公式:n(n-1)/2=O(n2)
所以最坏的时间复杂度为O(N2)
转载于:https://www.cnblogs.com/huohuoL/p/10545426.html
排序系列【比较排序系列之】直接插入排序相关推荐
- shell sort 最后一列排序_十个必知的排序算法|Python实例系列[1]
实例内容: 十个必知的排序算法具体代码,并简略的得知每种算法对于不同长度数列的排序时间 十大排序: 1.冒泡排序2.选择排序3.插入排序4.希尔排序5.归并排序6.快速排序7.堆排序8.计数排序9.桶 ...
- list 排序_十个必知的排序算法|Python实例系列
十大排序: 1.冒泡排序2.选择排序3.插入排序4.希尔排序5.归并排序6.快速排序7.堆排序8.计数排序9.桶排序10.基数排序 完整代码和注释如下 # -*- coding: UTF-8 -*-# ...
- shell sort 最后一列排序_算法实现系列(1)—— 排序算法
1.冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法.它重复地遍历过要排序的数列,每次比较两个元素,如果它们的顺序不符合预期,就把它们的位置交换过来.遍历数列的工作是重复地进行直到没有 ...
- 9个元素换6次达到排序序列_原创系列 |冒泡排序提升为快速排序,都发生了什么?...
「Python与算法社区」 第 310 篇原创 " 1 你会学到什么? " 彻底弄明白常用的排序算法的基本思想,算法的时间和空间复杂度,以及如何选择这些排序算法,确定要解决的问题的 ...
- 十大排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序
冒泡排序.选择排序.插入排序.希尔排序.归并排序.快速排序.堆排序.计数排序.桶排序.基数排序的动图与源代码. 目录 关于时间复杂度 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 ...
- 冒泡排序、插入排序、选择排序、希尔排序、堆排序、归并排序等常用排序算法的比较
掌握好常用的排序算法,在实际的项目开发中可以节省很多的时间.每一种排序算法在执行的效率上是存在差别的,这些微小的时间差,也许在平常的联系当中感觉不到,但是涉及到数据量比较大或者是在资源比较紧张的系统中 ...
- 排序算法:冒泡排序、插入排序、选择排序、希尔排序
相关博客: 排序算法:冒泡排序.插入排序.选择排序.希尔排序 排序算法:归并排序.快速排序 排序算法:桶排序.计数排序.基数排序 排序算法:堆排序 十大排序算法小结 一.冒泡排序: 1.算法原理: 冒 ...
- C语言排序算法 选择排序 插入排序 快速排序 qsort实现快排 堆排序
常见排序算法 选择排序 选择排序(Selection sort)是一种简单直观的排序算法. 它的工作原理如下. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素 ...
- C语言排序(桶排序,冒泡排序,选择排序,插入排序,快速排序)
参考:C语言五大排序(桶排序,冒泡排序,选择排序,插入排序,快速排序)动态演示 作者:一只青木呀 发布时间: 2020-09-09 20:18:43 网址:https://blog.csdn.net/ ...
- 排序算法--(冒泡排序,插入排序,选择排序,归并排序,快速排序,桶排序,计数排序,基数排序)
一.时间复杂度分析 - **时间复杂度**:对排序数据的总的操作次数.反应当n变化时,操作次数呈现什么规律 - **空间复杂度**:算法在计算机内执行时所需要的存储空间的容量,它也是数据规模n的函数. ...
最新文章
- 构建增强现实移动应用程序的六款顶级工具
- 使用webpack配置react并添加到flask应用
- java 连等_java并发之LBQ和ABQ(1)
- hibernate中antlr对于hql与sql的转换源码的一些细节
- PostgreSQL 12系统表(9)pg_settings
- 华为S2600T------v1版本
- 家里的狗为什么打不过猫
- 基于C语言的双人贪吃蛇游戏程序设计
- 在电脑上如何快速制作一寸照片?在线一键制作工具推荐给你
- win10系统无法开启远程服务器配置,win10系统无法连接远程服务器的方案介绍...
- 结合OPENCV SIFT代码浅谈Lowe的一些SIFT算法细节
- Auto.js蚂蚁森林自动偷能量脚本
- 大数据背后的神秘公式(上):贝叶斯公式
- 产品经理 项目经理 技术经理的区别
- uni-app 封装接口 405错误
- 数据同步利器之Tapdata Cloud
- Fiddler 安装使用教程
- Delphi下的MPS
- 通信原理简明教程 | 信号、信道与噪声
- Linux文件系统功能和作用详解
热门文章
- 【Loj - 515】贪心只能过样例(暴力,或01背包 + bitset)
- 【CodeForces - 485D】Maximum Value (枚举,用数组离散化,数学,取模运算,因子,筛法)
- 传统POS/终端/银联POS简介
- Apollo进阶课程⑯丨Apollo感知之旅——感知概貌
- mysql授权 改表_mysql开启远程登陆(修改数据表和授权两种方法)
- app+java_App Store 上的“Java大全”
- Oracle数据库Date类型查询问题(
- 学习笔记7-C语言-进制转换、原返补、位运算、函数
- 剑指offer之求1+2+...+n
- Linux下的xml文件的创建