深入浅出排序算法之直接插入排序(拓展:折半插入排序)

目录

1. 图示解析

2. 原理解析

3. 代码实现

4. 性能分析

5. 折半插入排序(拓展)


直接插入排序和选择排序的第一趟就是第一个关键字 !

1. 图示解析

2. 原理解析

整个区间被分为:① 有序区间;② 无序区间

每次选择无序区间的第一个元素,在有序区间内选择合适的位置插入。

为了各位小伙伴能更加清楚地认识直接插入排序,我接下用文字描述直接插入排序的过程!

想通过一个例子来体会一下插入排序的执行流程。例如,对原始序列{49,38,65,97,76,13,27,49}进行直接插入排序的具体流程如下(序列中有两个49,其中一个加下划线,加以区分)。

原始序列:49   38   65   97   76   13   27   49

(1)一开始只看49,一个数当然是有序的。

有序序列:{49};无序序列:{38   65   97   76   13   27   49}

(2)向有序序列插入38,38 < 49,所以49向后移动一个位置,38插入到49原来的位置,这趟排序后的结果为:

有序序列:{38   49};无序序列:{ 65   97   76   13   27   49}

(3)向有序序列插入65,65  > 49,所以不需要移动,65就应该在49只有,这趟排序后的结果为:

有序序列:{38   49   65};无序序列:{97   76   13   27   49}

(4)插入97,97 > 65,所以不需要移动,97就应该在65之后,这趟排序后的结果为:

有序序列:{38   49   65   97};无序序列:{76   13   27   49}

(5)插入76,76 < 97,所以97向后移动一个位置,继续比较,76 > 65,65不需要移动,76应该插入在65之后,97之前,这趟排序后的结果为:

有序序列:{38   49   65   76   97};无序序列:{13   27   49}

(6)插入13,13 < 97,97后移;13 < 76,76后移;这样逐个向前比较,发现13应该插入在最前面,这趟排序后的结果为:

有序序列:{13   38   49   65   76   97};无序序列:{27   49}

(7)插入27,还是从后面前行比较,确定27应该插入在13之后、38之前,这趟排序后的结果为:

有序序列:{13   27   38   49   65   76   97};无序序列:{49}

(8)最后插入49,同样从后向前逐个比较,知道49 = 49 < 65,它的位置确定,直接插入排序全过程完成。最后的排序结果为:

有序序列:{13   27   38   49   49   65   76   97};无序序列:{}

总结算法思想:

每趟将一个待排序的关键字按照其值的大小插入到已经拍好的部分有序序列的位置上直到所有待排序关键字都插入到有序序列中为止。

注意!!!!!!!!!!

小伙伴们请注意,我这里省略了i = 0的情况,从i = 1开始,也就是一开始只看49,一个数当然是有序的。如果是在考试中一定要把i = 0的情况作为第一趟(针对专升本和考研都一样)。

3. 代码实现

    //直接插入排序public static void insertSort(int[] arr) {//代码可以从i = 1开始算起,但是做题画图时,一定要从i = 0开始算起for (int i = 1; i < arr.length; i++) {int j = i - 1;int tmp = arr[i];for (; j >= 0; j--) {//如果arr[j] > tmp变成arr[j] >= tmp就变成不稳定了if (arr[j] > tmp) {arr[j + 1] = arr[j];} else {break;}}arr[j + 1] = tmp;}}public static void main(String[] args) {int[] arr = {10,9,8,7,6,5,4,3,2,1};Sort.insertSort(arr);for (int x : arr) {System.out.print(x + " ");}}

4. 性能分析

时间复杂度空间复杂度
最好平均最坏
O(N)O(N^2)O(N^2)O(1)
数据有序数据逆序

稳定性:稳定

如果一个排序是稳定的,那么就可以实现为不稳定的

但是如果一个算法本身是不稳定的,你没办法实现为稳定的排序

插入排序,原始数据越有序,时间效率越高!

检测一下:

    //创建升序数组public static void createArray1(int[] arr){for(int i = 1;i<10000;i++){arr[i - 1] = i;}}//创建逆序数组public static void createArray2(int[] arr){for(int i = 0;i<10000;i++){arr[i] = 10000 - i;}}public static void main(String[] args) {int[] arr1 = new int[10000];Test.createArray1(arr1);long s1 = System.currentTimeMillis();Sort.insertSort(arr1);long e1 = System.currentTimeMillis();System.out.println("数组有序的情况:"+(e1 - s1));int[] arr2 = new int[10000];Test.createArray2(arr2);long s2 = System.currentTimeMillis();Sort.insertSort(arr2);long e2 = System.currentTimeMillis();System.out.println("数组逆序的情况:"+(e2 - s2));}

 

5. 折半插入排序(拓展)

在有序区间选择数据应该插入的位置时,因为区间的有序性,可以利用折半查找的思想来增加插入算法的效率!

    //折半插入排序public static void bsInsertSort(int[] arr) {//代码可以从i = 1开始算起,但是做题画图时,一定要从i = 0开始算起for (int i = 1; i < arr.length; i++) {int v = arr[i];int left = 0;//左边标记永远从0下标开始int right = i;while(left < right){int mid = (left + right) / 2;//需要[left right)if(arr[mid] < v){//如果区间要闭,就赋值mid + 1或者mid - 1left = mid + 1;}else{//如果右区间要开,就赋值midright = mid;}}for (int j = i; j > left; j--) {arr[j] = arr[j - 1];}arr[left] = v;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/170254.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【2023】通过redis 实现分布式锁由原生到Redisson代码三种实现和介绍

目录 一、简介分布式锁的实现应该具备哪些条件分布式锁的实现方式 二、具体实现1、RedisTemplate的setnx方式实现1.1、基本配置1.1.1、创建spring项目添加依赖1.1.2、添加RedisTemplate配置bean 1.2、编写DistributedLock类1.2、编写Controller层使用分布式锁1.3、可能出现的问…

智慧公厕:细致入微的城市贴心服务与便捷方便的生活配套

在现代城市生活中&#xff0c;公厕作为重要的城市基础设施&#xff0c;一直是城市发展的关键环节之一。然而&#xff0c;传统的公厕常常存在着设施陈旧、管理不善和卫生状况差等问题&#xff0c;给市民的生活品质和城市形象带来了一定的影响。为了提供更好的城市公厕服务&#…

正点原子嵌入式linux驱动开发——Linux PWM驱动

PWM是很常用到功能&#xff0c;可以通过PWM来控制电机速度&#xff0c;也可以使用PWM来控制LCD的背光亮度。本章就来学习一下如何在Linux下进行PWM驱动开发。 PWM驱动解析 不在介绍PWM是什么了&#xff0c;直接进入使用。 给LCD的背光引脚输入一个PWM信号&#xff0c;这样就…

25装饰器2

有一个比较绕的地方&#xff0c;但是我相信我能理解透彻这个里面的逻辑还有原理 def check(func):print(登录验证)def inner():func()return innerdef fss():print(发说说)fss check(fss) fss()这里的fss check(fss)还有后面的fss()什么意思&#xff1f;怎么理解呢&#xff…

【微信小程序开发】小程序微信用户授权登录(用户信息手机号)

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于小程序的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 授权流程讲解 一.用户信息授权登录 1.w…

记一次vue3实现TRSP大华相机拉流的经历

一、背景 业务场景&#xff0c;大华IP相机安装在A城市某建筑场所&#xff0c;工控机是内网通过4G流量卡上网&#xff0c;工控机通过相机采集数据后做故障识别并上传故障信息到地面服务器&#xff0c;地面服务器在B城市。 现需要在地面服务器提供的WEB界面上实现IP相机实时拉流…

CSS基础框盒模型:打造炙手可热的网页布局!

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一、是…

逐鹿千亿市场:一碗中国面的魅力

【潮汐商业评论/原创】 根据世界方便面协会&#xff08;WINA&#xff09;发布的数据&#xff0c;2022年全球方便面总需求量同比增长4.0%至1212亿份&#xff0c;再创历史新高。从小门头商铺到大型商超&#xff0c;从线下到线上&#xff0c;方便面早就走进了千家万户&#xff0c…

使用adobe font style 工具绘制的艺术字,请鉴赏。

Adobe Fireflyhttps://firefly.adobe.com/generate/font-styles

引领位置服务驱动:腾讯地图 WebService 服务端 API 实用指南

&#x1f52d; 嗨&#xff0c;您好 &#x1f44b; 我是 vnjohn&#xff0c;在互联网企业担任 Java 开发&#xff0c;CSDN 优质创作者 &#x1f4d6; 推荐专栏&#xff1a;Spring、MySQL、Nacos、Java&#xff0c;后续其他专栏会持续优化更新迭代 &#x1f332;文章所在专栏&…

马蹄集OJ赛第十三次

目录 小码哥的抽卡之旅 抽奖概率 越狱 square 矩阵乘法 找朋友 赌石 甜甜花的研究 行列式 饿饿&#xff01;饭饭&#xff01; 小码哥的抽卡之旅 难度&#xff1a;黄金 ①时间限制&#xff1a;1秒 巴占用内存&#xff1a;128M 小码哥最近迷上了一款抽卡游戏。单抽出金…

AWS Lambda 操作 RDS 示例

实现目标 创建一个 Lambda 接收调用时传入的数据, 写入 RDS 数据库 Post 表存储文章信息. 表结构如下: idtitlecontentcreate_date1我是标题我是正文内容2023-10-21 15:20:00 AWS 资源准备 RDS 控制台创建 MySQL 实例, 不允许 Public access (后面 Lambda 需要通过 VPC 访问…

基于MIMO+16QAM系统的VBLAST译码算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ........................................................................ for SNR_dBSNRS…

element-plus 自动按需引入icon unplugin-icons相关配置(有效)

1.安装的组件有这四个2.vite.config.js配置文件修改页面使用附完整vite.config.js配置 相关配置&#xff08;自行根据配置文件中的安装哈&#xff0c;我就不一 一列举了&#xff09; 1.安装的组件有这四个 2.vite.config.js配置文件修改 页面使用 <i-ep-edit />效果 附…

pytorch学习第四篇:从全连接到卷积

传统神经网络 传统神经网络nn,采用这种全连接的方式,可以看出是一列一列数据,包括起始和中间的隐层都是一列数据。 例如我们再对图像用这种方式来计算,需要把图像转为一列数据,例如图像为28x28单通道图像,需要转为28x28=784的列数据再进行神经网络训练。 input layer =…

基于 Android 的文件同步设计方案

1、背景 随着用户对自身数据保护意识的加强&#xff0c;让用户自己维护自己的数据也成了独立开发产品时的一个卖点。若只针对少量的文件进行同步&#xff0c;则实现起来比较简单。当针对一个多层级目录同步时&#xff0c;情况就复杂多了。鉴于相关的文章甚少&#xff0c;本文我…

【从删库到跑路】MySQL数据库 | 存储过程 | 存储函数(使用代码辅助理解)

&#x1f38a;专栏【MySQL】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【The Right Path】 &#x1f970;欢迎并且感谢大家指出小吉的问题 文章目录 &#x1f384;存储过程介绍&#x1f384;存储过程特点&#x1f33a;存储过…

找搭子平台小程序开发制作方案

找搭子小程序是一个基于地理位置的社交平台&#xff0c;旨在帮助用户找到附近的人&#xff0c;一起进行各种活动。的目标是打造一个安全、便捷、有趣的社交平台&#xff0c;让用户在享受活动的同时&#xff0c;也能结识新朋友。 找搭子平台小程序的目标用户主要是年轻人&#x…

「北大社送书」学习Flutter编程 — 《从零基础到精通Flutter开发》

目录 1.书籍推荐理由 2.本书特色 3.内容简介 4.书籍概览 1.书籍推荐理由 一套代码&#xff0c;构建多平台精美的应用&#xff1a;本书从真实的开发场景出发&#xff0c;完整地讲解了Flutter框架&#xff0c;帮助你快速掌握Flutter的基础知识和开发技巧&#xff0c;助你在移…

stm32外部时钟为12MHZ,修改代码适配

代码默认是8MHZ的&#xff0c;修改2个地方&#xff1a; 第一个地方是这个文件的这里&#xff1a; 第二个地方是找到这个函数&#xff1a; 修改第二个地方的这里&#xff1a;