十大经典排序算法之插入排序及其二分优化
一、插入排序的实现
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)
二分插入排序只是减少了比较的次数,而数据的移动次数还是不变的;
本质上来说:直接插入排序和二分插入排序性能上差不了多少
十大经典排序算法之插入排序及其二分优化相关推荐
- 十大经典排序算法总结(够兄弟们喝一壶的)
Ⅰ.十大经典排序算法之插入排序及其二分优化:https://blog.csdn.net/Kevinnsm/article/details/114403557 Ⅱ.十大经典排序算法之冒泡排序及其优化:h ...
- 【完整可运行源码+GIF动画演示】十大经典排序算法系列——冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序
以前也零零碎碎发过一些排序算法,但总是不系统, 这次彻底的对排序系列做了一个整体的规划, 小伙伴们快快mark哦~ [GIF动画+完整可运行源代码]C++实现 冒泡排序--十大经典排序算法之一 [GI ...
- 【GIF动画+完整可运行源代码】C++实现 插入排序——十大经典排序算法之三
十大经典排序算法系列博客-->传送门 插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 算法步骤: 从第一个元素开始,该元素认为已经被排序: ...
- 十大经典排序算法详解(一)冒泡排序,选择排序,插入排序
养成习惯,先赞后看!!! 你的点赞与关注真的对我非常有帮助.如果可以的话,动动手指,一键三连吧!!! 目录 1.算法的评判标准 2.排序算法的分类 3.十大经典排序算法-冒泡排序,选择排序,插入排序 ...
- 十大经典排序算法动画与解析,看我就够了
作者 | 程序员小吴 转载自五分钟学算法(ID: CXYxiaowu) 排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序.内部排序是数据记录在内存中进行 ...
- 十大经典排序算法(建议收藏)
来自:Damonare的个人博客 原文:http://blog.damonare.cn/2016/12/20/十大经典排序算法总结(javascript描述)/ 0.算法概述 0.1 算法分类 十种 ...
- python经典排序_python实现十大经典排序算法
写在前面 本文参考十大经典排序算法(动图演示),这篇文章有动图显示,介绍的很详细.本文是部分内容有借鉴此博客,用python实现,有一些改进. 各种算法的时间.空间复杂度 1.冒泡排序 1.比较相邻的 ...
- 教小学妹学算法:十大经典排序算法深度解析
最近有一位小学妹 Coco 入坑了算法,结果上来就被几个排序算法给整懵逼了,各种排序眼花缭乱,也分不清什么时候该用什么排序了. 今天呢,就在这分享一下我给小学妹讲十大经典排序算法的过程. 好吧,那我们 ...
- C++实现桶排序——十大经典排序算法之九【GIF动画+完整代码+详细注释】
十大经典排序算法系列博客-->传送门 桶排序是计数排序的升级版.它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定.桶排序 (Bucket sort)的工作的原理:假设输入数据服从均 ...
最新文章
- hbase-site.xml 和 hbase-default.xml
- nginx-rtmp常用指令
- arcgis根据矢量范围裁取tif影像(栅格数据)、批量合并shp文件、根据矢量范围裁取区域内的矢量,输出地理坐标系
- 2022 CCF中国软件大会(CCF Chinasoft)“软件可信性与供应链安全前沿进展”论坛成功召开...
- [转]DivX和XviD不能不说的故事
- 【附资料】PMP证书有用吗?
- java ImageIO处理
- 浅谈叠片过滤器设计选型与技术要求
- php支付宝聚合支付源码,ThinkPHP5.1聚合支付源码
- 已有123所大学将云创大数据人工智能免费直播课引入课堂!
- python抠图原理_一键智能抠图-原理与实现
- FIFA 世界杯 2022 电视直播观战私家指南
- Linux PAM 验证
- 双曲嵌入论文与代码实现——1. 数据集介绍
- Facebook营销进阶技巧有哪些
- 5SHY3545L0016 3BHB020720R0002 3BHE019719R0101 GVC736BE101
- 线性代数[矩阵的秩]
- 图文详解 IntelliJ IDEA 15 创建 Maven 构建的 Java Web 项目(使用 Jetty 容器)
- 强化学习笔记二 -- MDP
- 字符和字节的区别与分析
热门文章
- 【Leetcode】【Medium】Rotate Image
- HTML的<span>标签【杂记】
- 开发商微信选房后不退认筹金_【震惊】胶州恒大文化旅游城项目爆丑闻!2000余人缴纳认筹金后竟有1800余户因对房子不满意提出退款...
- Android底层网络防火墙,详解Android 利用Iptables实现网络黑白名单(防火墙)
- hashCode() 和equals() 区别和作用
- 三十七、Sql 补充 | 数据库优化
- Python字符型验证码识别
- opencv图像处理(二)
- keras从入门到放弃(十四)模型的保存
- 乘风破浪的Seq2Seq模型:在事件抽取上的应用