一、插入排序的实现

1.什么是插入排序呢

插入排序的工作方式像许多人排序一手扑克牌。开始时,我们的左手为空并且桌子上的牌面向下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较。拿在左手上的牌总是排序好的,原来这些牌是桌子上牌堆中顶部的牌

2.具体步骤

第一轮:从第二位置的 6 开始比较,比前面 7 小,交换位置。

第二轮:第三位置的 9 比前一位置的 7 大,无需交换位置。

第三轮:第四位置的 3 比前一位置的 9 小交换位置,依次往前比较。

第四轮:第五位置的 1 比前一位置的 9 小,交换位置,再依次往前比较。

就这样依次比较到最后一个元素。

3.使用循环不变式证明算法的正确性

循环不变式的概念
简单了说就是每次循环都有某种性质,且该性质一直保持不变,直到循环结束。

循环不变式的三个性质:

1.初始化:循环的第一次迭代之前,它为真。
2.保持:如果循环的某次迭代之前它为真,那么下次迭代之前它仍为真。
3.终止:在循环终止时,不变式为我们提供一个有用的性质,该性质有助于证明算法时正确的。

对于插入排序,如何证明这三个性质

初始化:插入排序初始只有1个元素arr[0],所以该子数组是有序的
保持:每次插入元素到子数组中,该子数组一直保持有序性
终止:循环的终止条件是遍历到了最后一个将要插入的元素,此时插入过后,子数组已经拥有了原数组的所有数据,且保持有序

因此算法正确。

4.插入排序代码实现

import java.util.Arrays;/*** @author:抱着鱼睡觉的喵喵* @date:2021/2/23* @description: 插入排序*/
public class InsertSort {public static void main(String[] args) {int arr[] = {9,1,4,2,8};InsertSort(arr);System.out.println(Arrays.toString(arr));}public static void InsertSort(int[] arr) {for (int i = 1; i < arr.length; i++) {int insertVal = arr[i];int insertIndex =i - 1;while (insertIndex >= 0 && insertVal < arr[insertIndex]) {arr[insertIndex + 1] = arr[insertIndex];insertIndex--;}arr[insertIndex + 1] = insertVal;}}
}

5.插入排序算法的分析

1.时间复杂度:最坏的情况就是原数组的数据是降序排列,最好的情况当然就是已经有序(升序)
最坏的情况:O(n^2)
最好的情况:O(n)
所以平均时间复杂度位O(n^2)

2.空间复杂度:O(1)

3.插入排序是稳定的;适用场景:数据规模较小


二、插入排序的优化

于插入排序,如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的次数。

1.二分查找算法概述(折半查找法):

二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x.

2.代码实现


import java.util.Arrays;/*** @author:抱着鱼睡觉的喵喵* @date:2021/3/4* @description: 使用二分法优化直接插入*/
public class DichotomizeInsertSort {public static void main(String[] args) {int arr[] = {2, 5, 8, -11, 6,-19, 7, 8};InsertSort(arr);System.out.println(Arrays.toString(arr));}public static void InsertSort(int arr[]) {int insertValue,mid = 0;int i,j,insertIndex;for (int k = 1; k < arr.length; k++) {i = 0;insertIndex  = k;j = k - 1;insertValue = arr[k];while (i <= j) {mid = (i + j) / 2;if (arr[mid] < insertValue) {i = mid + 1;} else {j = mid - 1;}}for (int s = insertIndex - 1; s >= i; s--) {arr[s + 1] = arr[s];}arr[i] = insertValue;}}}

3.复杂度分析
时间复杂度:O(n^2)

二分插入排序只是减少了比较的次数,而数据的移动次数还是不变的;
本质上来说:直接插入排序和二分插入排序性能上差不了多少

十大经典排序算法之插入排序及其二分优化相关推荐

  1. 十大经典排序算法总结(够兄弟们喝一壶的)

    Ⅰ.十大经典排序算法之插入排序及其二分优化:https://blog.csdn.net/Kevinnsm/article/details/114403557 Ⅱ.十大经典排序算法之冒泡排序及其优化:h ...

  2. 【完整可运行源码+GIF动画演示】十大经典排序算法系列——冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序

    以前也零零碎碎发过一些排序算法,但总是不系统, 这次彻底的对排序系列做了一个整体的规划, 小伙伴们快快mark哦~ [GIF动画+完整可运行源代码]C++实现 冒泡排序--十大经典排序算法之一 [GI ...

  3. 【GIF动画+完整可运行源代码】C++实现 插入排序——十大经典排序算法之三

    十大经典排序算法系列博客-->传送门 插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 算法步骤: 从第一个元素开始,该元素认为已经被排序: ...

  4. 十大经典排序算法详解(一)冒泡排序,选择排序,插入排序

    养成习惯,先赞后看!!! 你的点赞与关注真的对我非常有帮助.如果可以的话,动动手指,一键三连吧!!! 目录 1.算法的评判标准 2.排序算法的分类 3.十大经典排序算法-冒泡排序,选择排序,插入排序 ...

  5. 十大经典排序算法动画与解析,看我就够了

    作者 | 程序员小吴 转载自五分钟学算法(ID: CXYxiaowu) 排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序.内部排序是数据记录在内存中进行 ...

  6. 十大经典排序算法(建议收藏)

    来自:Damonare的个人博客 原文:http://blog.damonare.cn/2016/12/20/十大经典排序算法总结(javascript描述)/ 0.算法概述  0.1 算法分类 十种 ...

  7. python经典排序_python实现十大经典排序算法

    写在前面 本文参考十大经典排序算法(动图演示),这篇文章有动图显示,介绍的很详细.本文是部分内容有借鉴此博客,用python实现,有一些改进. 各种算法的时间.空间复杂度 1.冒泡排序 1.比较相邻的 ...

  8. 教小学妹学算法:十大经典排序算法深度解析

    最近有一位小学妹 Coco 入坑了算法,结果上来就被几个排序算法给整懵逼了,各种排序眼花缭乱,也分不清什么时候该用什么排序了. 今天呢,就在这分享一下我给小学妹讲十大经典排序算法的过程. 好吧,那我们 ...

  9. C++实现桶排序——十大经典排序算法之九【GIF动画+完整代码+详细注释】

    十大经典排序算法系列博客-->传送门 桶排序是计数排序的升级版.它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定.桶排序 (Bucket sort)的工作的原理:假设输入数据服从均 ...

最新文章

  1. hbase-site.xml 和 hbase-default.xml
  2. nginx-rtmp常用指令
  3. arcgis根据矢量范围裁取tif影像(栅格数据)、批量合并shp文件、根据矢量范围裁取区域内的矢量,输出地理坐标系
  4. 2022 CCF中国软件大会(CCF Chinasoft)“软件可信性与供应链安全前沿进展”论坛成功召开...
  5. [转]DivX和XviD不能不说的故事
  6. 【附资料】PMP证书有用吗?
  7. java ImageIO处理
  8. 浅谈叠片过滤器设计选型与技术要求
  9. php支付宝聚合支付源码,ThinkPHP5.1聚合支付源码
  10. 已有123所大学将云创大数据人工智能免费直播课引入课堂!
  11. python抠图原理_一键智能抠图-原理与实现
  12. FIFA 世界杯 2022 电视直播观战私家指南
  13. Linux PAM 验证
  14. 双曲嵌入论文与代码实现——1. 数据集介绍
  15. Facebook营销进阶技巧有哪些
  16. 5SHY3545L0016 3BHB020720R0002 3BHE019719R0101 GVC736BE101
  17. 线性代数[矩阵的秩]
  18. 图文详解 IntelliJ IDEA 15 创建 Maven 构建的 Java Web 项目(使用 Jetty 容器)
  19. 强化学习笔记二 -- MDP
  20. 字符和字节的区别与分析

热门文章

  1. 【Leetcode】【Medium】Rotate Image
  2. HTML的<span>标签【杂记】
  3. 开发商微信选房后不退认筹金_【震惊】胶州恒大文化旅游城项目爆丑闻!2000余人缴纳认筹金后竟有1800余户因对房子不满意提出退款...
  4. Android底层网络防火墙,详解Android 利用Iptables实现网络黑白名单(防火墙)
  5. hashCode() 和equals() 区别和作用
  6. 三十七、Sql 补充 | 数据库优化
  7. Python字符型验证码识别
  8. opencv图像处理(二)
  9. keras从入门到放弃(十四)模型的保存
  10. 乘风破浪的Seq2Seq模型:在事件抽取上的应用