当前位置: 首页 > news >正文

九大排序之插入排序

1.前言

插入排序是把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。实际中我们玩扑克牌时,就用了插入排序的思想。

                    

本章重点:主要着重的介绍两种插入排序的方式--直接插入排序和希尔排序

2.直接插入排序

抓扑克牌思想:当抓了第一张的时候,因为手里没有牌,所以无需插入,直接放在手里。当抓第二张的时候,就要与手里最末尾的那张进行比较,判断大小,如果末尾大于抓上来的牌,那么就依次向前比较,直到找到第一个比刚抓上来的值小的数为止。

直接插入排序思想:借助了抓扑克牌思想的例子,直接插入排序是手里已经有一堆乱序的值,然后这些值需要用到抓扑克牌的思想来把它们进行排序。

void Insert(int * arr,int n)
{//1.先确定要比较多少次能够把这些数变成有序的,n-1次for(int i=0;i<n-1;i++){int end=i;int tmp=arr[end+1];while(end>=0){if(arr[end]>tmp){arr[end+1]=arr[end];end--;}else break;}arr[end+1]=tmp;}
}

把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。

演示动画如下:

直接插入排序特性总结:

1.当一串数越有序时,直接插入排序的效率越高

2.时间复杂度为:O(N)~O(N^2)

3.空间复杂度为:O(1)

4.稳定性:稳定

3.希尔排序

基本思路:

希尔排序是直接插入排序的优化版本:由于直接插入排序对顺序有序或接近有序的序列排序效率很高。所以希尔排序先通过多次分组预排序使序列接近有序,最后再进行直接插入排序≈O(N),以此来提高效率。
多次分组预排序:就是将序列进行间隔分组,对同一组内的元素进行直接插入排序,并不断缩小分组间距。

如何分组:
1.通过增量gap对序列进行分组控制,gap是组内元素之间的间距,同时也是组数。
2.gap初始化为n; 每次分组预排gap = gap/3+1;除3是进过多次试验得出的最佳缩小系数,加1是为了避免跳过最后一次直接插入排序。
直到gap==1进行最后一次直接插入排序使序列顺序有序。

示例如下:

代码如下:

以升序为例

void ShellSort(int *arr, int n){assert(arr != NULL);//写法一(便于理解):排完一组再排下一组int gap = n;while (gap > 1){//多次分组预排序,分组数量每次减少,直到1组排完。gap = gap / 3 + 1;//加1,防止跳过gap == 1//每次排序的起点for (int i = 0; i < gap; i++){//单组单组的进行排序--每组间隔gap//同直接插入排序。j < n - gap,保证最后一个待排记录不会越界。for (int j = i; j < n - gap; j+=gap){int end = j;int x = arr[end + gap];while (end >= i){if (x < arr[end]){arr[end + gap] = arr[end];end -= gap;}else{break;}}//找到插入位置后,end还会减一次,所以+gaparr[end + gap] = x;}}}//写法二(简洁):gap组数据交替插入排序int gap = n;while (gap > 1){gap = gap / 3 + 1;for (int i = 0; i < n - gap; i++){int end = i;int x = arr[end + gap];while (end >= 0){if (x < arr[end]){arr[end + gap] = arr[end];end -= gap;}else{break;}}arr[end + gap] = x;}}
}

动画演示如下:

希尔排序的时间复杂度分析:

        gap越大,预排越快,预排后越不接近有序。(大数字会很快移动到后面);gap越小,预排越慢,预排后越接近有序。开始时gap较大:组内元素数量较少,因此即便是最坏情况时间复杂度都大约为:O(N);

同时由于分组间隔较大,大数字会很快移动到数列后面,使数列逐渐接近有序;gap逐渐变小直到1:组内元素数量增多,但由于数列逐渐接近有序,因此时间复杂度也大约为:O(N)


分组预排序的时间复杂度:
最好:N/gap*gap —> O(N)(每组大约N/gap个元素)
最坏:(1+2+3+…+N/gap)*gap; (gap越大,越接近N最坏情况越接近O(N))


希尔排序的时间复杂度:
gap = gap/2;
理想情况下,大约为N*log2 N(进行lon2 N次预排,每次复杂度接近O(N))
gap = gap/3+1;
理想情况下,大约为N*log3 N
gap由大变小,开始时由于gap很大,时间复杂度都大约为O(N)。多次预排序使得数组越来越接近有序。虽然gap变小了,每次排序的复杂度也都大约为O(N)。

注意:O(nlogn)是理想情况下的复杂度,而实际上在足够大的输入规模下,它的运行时间将超过具有时间复杂度 nlogn 的算法。多次实验得出希尔排序的时间复杂度平均大约为O(N^1.3),做到了对直接插入排序的优化。

希尔排序的特性总结:

希尔排序是对直接插入排序的优化。当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时是直接插入排序,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。
时间复杂度:O(N^1.3) (或NlogN) ~ O(N^2)(逆序)
空间复杂度:O(1)
稳定性:不稳定,相等的关键字可能会被划分到不同的组进行预排序
 

相关文章:

九大排序之插入排序

1.前言 插入排序是把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。实际中我们玩扑克牌时&#xff0c;就用了插入排序的思想。 本章重点&#xff1a;主要着重的介绍两种插入排序…...

DNABERT: 一个基于 Transformer 双向编码器表征的预训练 DNA 语言模型

本文结合 DNABERT 的原文&#xff0c;主要介绍了&#xff1a; Overview of DNABERT 开发 DNABERT 的背景 DNABERT 的 tokenization DNABERT 的模型架构 DNABERT 的预训练 基于微调 DNABERT 的应用 1. Overview of DNABERT 我们之前介绍了 BERT&#xff0c;它是一个基于 Transfo…...

基于Hive和Hadoop的电商消费分析系统

本项目是一个基于大数据技术的电商消费分析系统&#xff0c;旨在为用户提供全面的电商消费信息和深入的消费行为分析。系统采用 Hadoop 平台进行大规模数据存储和处理&#xff0c;利用 MapReduce 进行数据分析和处理&#xff0c;通过 Sqoop 实现数据的导入导出&#xff0c;以 S…...

记一次炉石传说记牌器 Crash 排查经历

大家好这里是 Geek技术前线。最近在打炉石过程中遇到了HSTracker记牌器的一个闪退问题&#xff0c;尝试性排查了下原因。这里简单记录一下 最近炉石国服回归&#xff1b;由于设备限制&#xff0c;我基本只会在 Mac 上打炉石。并且由于主要打竞技场&#xff0c;所以记牌器是必不…...

精益驱动的敏捷开发

1. 什么是精益&#xff1f;精益能给软件开发带来什么&#xff1f; 精益是一种起源于制造业的管理哲学&#xff0c;尤其是从丰田的生产体系中发展而来。它的核心目标是通过最小化浪费、提高效率和优化流程来实现高效的生产。精益的核心原则包括&#xff1a; 消除浪费&#xff…...

SolidWorks机器转ROS2 URDF

文章目录 开发环境SolidWords插件使用生成urdf文件之后的处理CMakeLists文件修改package.xml变更Launch更改运行 开发环境 Linux系统&#xff1a;Ubuntu 22.04 Ros2版本&#xff1a;humble Solidwords版本&#xff1a;2023 &#xff08;2019以上版本应该都是可以的&#xff09…...

(Linux驱动学习 - 6).Linux中断

一. Linux 中断 API 函数 1.中断号 每个中断都有一个中断号&#xff0c;通过中断号即可区分不同的中断&#xff0c;有的资料也把中断号叫做中 断线。在 Linux 内核中使用一个 int 变量表示中断号。 2.申请中断 - request_irq 函数原型&#xff1a; int request_irq(unsigne…...

SpringBoot驱动的明星周边产品电商解决方案

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…...

C++、Ruby和JavaScript

C C最初被称为带类的C, 兼容C的语法&#xff0c;此既是C得以流行的前提&#xff0c;也是C某些语法被捆绑的根源。C的来源于C语言的递增运算符&#xff0c;代表增加&#xff0c;意义为扩展。 C的历史 C类的设计思想来源于Simula. Simula为模拟的意思&#xff0c;被称为最早的面向…...

32单片机 低功耗模式

以下是一个基于STM32的低功耗模式示例代码&#xff0c;展示如何将STM32微控制器置于低功耗模式&#xff0c;并在特定条件下唤醒它。这个示例使用的是STM32 HAL库。 ### 示例代码&#xff1a;进入睡眠模式并使用外部中断唤醒 c #include "stm32f4xx_hal.h" // 函数声明…...

501、二叉搜索树中的众数

1、题目描述 . - 力扣&#xff08;LeetCode&#xff09; 要求&#xff1a;给一个包含重复值的BST&#xff0c;找出并返回BST中的众数(出现频次最高的元素)。 注&#xff1a;如果树中有不止一个众数可以按任意顺序返回&#xff0c;即如果有多个众数多个都要返回。 ps&#xff1…...

【洛谷】P2330 [SCOI2005] 繁忙的都市 的题解

【洛谷】P2330 [SCOI2005] 繁忙的都市 的题解 题目传送门 题解 水最小生成树&#xff0c;发现可以水一堆黄题qaq 这题显然就是求最大边权最小的生成树&#xff0c;而用 Kruskal 很容易证明这就是最小生成树&#xff0c;考虑一下这个算法每次取的都是不构成环的最小边即可&a…...

第18场小白入门赛(蓝桥杯)

第 18 场 小白入门赛 6 武功秘籍 考察进制理解。 对于第 i i i 位&#xff0c;设 b i t i x bit_ix biti​x &#xff0c;每一位的最大值是 b j b_j bj​ &#xff0c;也就是说每一位是 b j 1 b_j1 bj​1 进制 &#xff0c;那么第 i i i 位的大小就是 x ∑ j i 1…...

Redission · 可重入锁(Reentrant Lock)

前言 Redisson是一个强大的分布式Java对象和服务库&#xff0c;专为简化在分布式环境中的Java开发而设计。通过Redisson&#xff0c;开发人员可以轻松地在分布式系统中共享数据、实现分布式锁、创建分布式对象&#xff0c;并处理各种分布式场景的挑战。 Redisson的设计灵感来…...

初阶C语言-指针

1.指针是什么&#xff1f; 理解指针的两个要点&#xff1a; 1.指针是内存中一个最小单元的编号&#xff0c;也就是地址 2.口头语中说的指针&#xff0c;通常是指指针变量&#xff0c;是用来存放内存地址的变量 总结&#xff1a;指针就是地址&#xff0c;口语中说的指针通常是指…...

论文笔记:微表情欺骗检测

整理了AAAI2018 Deception Detection in Videos 论文的阅读笔记 背景模型实验可视化 背景 欺骗在我们的日常生活中很常见。一些谎言是无害的&#xff0c;而另一些谎言可能会产生严重的后果。例如&#xff0c;在法庭上撒谎可能会影响司法公正&#xff0c;让有罪的被告逍遥法外。…...

智能家居有哪些产品?生活中常见的人工智能有哪些?

智能家居有哪些产品? 1、智能照明设备类&#xff1a;智能开关、智能插座、灯控模块、智能空开、智能灯、无线开关。 2、家庭安防类&#xff1a;智能门锁、智能摄像机、智能猫眼、智能门铃。 3、智能传感器类&#xff1a;烟雾传感器、可燃气体传感器、水浸传感器、声光报警器…...

洗车行软件系统有哪些 佳易王洗车店会员管理系统操作教程#洗车店会员软件试用版下载

一、前言 【试用版软件下载可点击本文章最下方官网卡片】 洗车行软件系统有哪些 佳易王洗车店会员管理系统操作教程#洗车店会员软件试用版下载 洗车管理软件应用是洗车业务的得力助手&#xff0c;实现会员管理及数据统计一体化&#xff0c;助力店铺高效、有序运营。 洗车项…...

【Java】springboot 项目中出现中文乱码

在刚创建的springboot项目中&#xff0c;出现乱码&#xff0c;跟走着解决一下 1、Ctrl Shift S 打开idea设置&#xff0c;根据图片来&#xff0c;将③④这三个地方都修改为UTF-8 2、返回配置查看&#xff0c;解决...

开放式耳机是什么意思?漏音吗?开放式的运动蓝牙耳机推荐

目前运动耳机市场主要分为入耳式、骨传导和开放式三类。入耳式耳机占比30%-40%&#xff0c;虽目前占比较大&#xff0c;但因在运动场景下有闷塞感、出汗不适、屏蔽外界环境音带来安全隐患等缺点&#xff0c;占比会逐渐下降。 骨传导耳机占比也为30%-40%&#xff0c;其不堵塞耳…...

2026最权威的六大降重复率工具解析与推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 飞速发展的人工智能技术&#xff0c;正深切地重塑着学术写作的范式&#xff0c;当下&#xf…...

施密特触发器在智能家居中的7个隐藏用法:从空调变频到漏电保护

施密特触发器在智能家居中的7个隐藏用法&#xff1a;从空调变频到漏电保护 智能家居的普及让我们的生活更加便捷&#xff0c;但背后支撑这些设备的电子技术却鲜为人知。施密特触发器作为一种基础的电子元件&#xff0c;在智能家居系统中扮演着关键角色。它不仅能解决信号抖动问…...

5分钟掌握SQLite在线查看器:浏览器中的数据库管理革命

5分钟掌握SQLite在线查看器&#xff1a;浏览器中的数据库管理革命 【免费下载链接】sqlite-viewer View SQLite file online 项目地址: https://gitcode.com/gh_mirrors/sq/sqlite-viewer 在数据驱动的时代&#xff0c;SQLite数据库无处不在——从移动应用到嵌入式设备&…...

FPGA实战:手把手教你用Vivado的MMCM IP核动态调整ADC采样时钟相位(附仿真避坑指南)

FPGA实战&#xff1a;Vivado MMCM动态相位调整的工程化实现与深度避坑指南 在高速数据采集系统中&#xff0c;ADC采样时钟相位的精确控制往往是决定信号完整性的关键因素。当FPGA工程师发现采样数据存在周期性抖动或眼图闭合时&#xff0c;动态调整时钟相位便成为优化系统性能的…...

Nanbeige4.1-3B惊艳效果:同一硬件下对比Phi-3-mini,Nanbeige长文本保持率+35%

Nanbeige4.1-3B惊艳效果&#xff1a;同一硬件下对比Phi-3-mini&#xff0c;Nanbeige长文本保持率35% 最近&#xff0c;一个只有30亿参数的小模型在开发者圈子里悄悄火了起来。它不是那种动辄千亿参数、需要顶级显卡才能跑的“巨无霸”&#xff0c;而是一个在普通硬件上就能流畅…...

别再只记*#*#284#*#*了!揭秘小米手机日志抓取的‘售后模式’:CIT工具(*#*#6484#*#*)的隐藏用法与解读

解锁小米手机CIT工具的隐藏潜能&#xff1a;从硬件诊断到日志深度解析 在智能手机高度普及的今天&#xff0c;用户对设备问题的自主排查需求日益增长。小米手机内置的CIT工具&#xff08;Customer Interface Test&#xff09;作为售后服务的核心诊断利器&#xff0c;其实蕴藏着…...

3分钟找回丢失文件!FSearch让Linux搜索体验飞起来

3分钟找回丢失文件&#xff01;FSearch让Linux搜索体验飞起来 【免费下载链接】fsearch A fast file search utility for Unix-like systems based on GTK3 项目地址: https://gitcode.com/gh_mirrors/fs/fsearch 你是否曾在Linux系统中花费数分钟甚至数小时寻找一个文件…...

别再死记硬背MIPI状态转换图了!用Python脚本模拟单向/双向Data Lane状态机

用Python脚本动态解析MIPI状态机&#xff1a;从理论到实践的可视化之旅 每次打开MIPI协议文档看到那些密密麻麻的状态转换图&#xff0c;是不是感觉像在解读外星密码&#xff1f;作为嵌入式开发者&#xff0c;我们需要的不是死记硬背那些LP-11→LP-01的箭头指向&#xff0c;而…...

瑞芯微RK3399固件急救指南:用upgrade_tool搞定系统崩溃后的快速还原

RK3399固件灾难恢复实战&#xff1a;从分区表重建到全系统还原 当一块搭载RK3399的开发板因固件损坏而变砖时&#xff0c;那种面对黑屏的无力感&#xff0c;相信每个嵌入式开发者都深有体会。去年我们产线就遭遇过因批量升级失败导致30台设备集体罢工的紧急状况&#xff0c;正…...

Shadow Sound Hunter模型部署:Windows 11环境配置指南

Shadow & Sound Hunter模型部署&#xff1a;Windows 11环境配置指南 本文详细介绍了在Windows 11系统上部署Shadow & Sound Hunter模型的完整流程&#xff0c;包括系统要求、依赖安装、环境配置等关键步骤&#xff0c;帮助Windows用户快速上手。 1. 环境准备与系统要求…...