插入排序(直接插入排序与希尔排序)----数据结构-排序①

1、插入排序

1.1 插入排序的基本思想

        将待排序的元素按其数值的大小逐个插入到一个已经排好序的有序序列中,直到所有的元素插入完为止,就可以得到一个新的有序序列 。

实际上在我们的日常生活中,插入排序的应用是很广泛的,例如我们在玩扑克牌时,就利用了插入排序的思想,例如下图:

当我们手里已经具有 2、3、5、10 这样一个有序序列的扑克牌时,我们现在又出现一张 7 ,我们需要将其插入到我们已经有序的 2、3、5、10 序列中,我们先将需要插入的 7 与最后一张 10 进行大小比较,如果发现所插入的元素比 10 更小,就继续与前一个元素比较,直到发现所插入的元素大于该元素,就将其插入到该元素的后面即可。

1.2 直接插入排序 

有了上面对插入排序的理解,下面我们一起来学习一下直接插入排序。

排序思想:当我们插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的数值与 先后与array[i-1],array[i-2],…的数值进行比较,找到合适位置就将array[i]插入,该位置后的所有元素都需要依次往后移。

下面是示意图:

代码实现:

void InsertSort(int* a, int n)
{for (int i = 0; i < n - 1; i++){int end = i;  // 这里我们认为 [ 0 , end] 是已经有序的int tmp = a[end + 1];   // 将 end+1 位置的元素与前面 [ 0 , end] 的元素进行比较// 找到合适的位置就插入while (end >= 0){if (tmp < a[end]) // 如果前面的数据比 tmp 大就将该数据往后挪{                 // 并且比较 --end ,使tmp继续与前一个数据进行比较a[end + 1] = a[end];--end;}// tmp >= a[end]else   // 遇到前面的数据比 tmp 小或相等就跳出循环break;}// 此时 end+1的位置是空出来的,即 tmp 所插入的位置a[end + 1] = tmp;}
}

直接插入排序的特性总结:

1. 元素集合越接近有序,直接插入排序算法的时间效率越高

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

3. 空间复杂度:O(1),它是一种稳定的排序算法

4. 稳定性:稳定 

 1.3 希尔排序( 缩小增量排序 )

        希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数 gap(一组当中相邻元素的距离) ,把待排序文件中所有数分成个 gap (N是数据总个数)组,所有距离为 gap 的数分在同一组内,并分别对每一组内的数据进行一次插入排序。然后让 gap 不断的缩小,并重复上述分组和排序的工作。当到达 gap = 1 时,相当于进行了一次直接插入排序,这一次排序结束后,所有数在同一组内被排好序。

下面是希尔排序动图演示:

 gap的取法:

gap的取法有很多种,但主流的两种取法是 :①gap = gap/2;②gap = gap/3 +1。

下面我们以gap = gap/3 + 1 这种取法为例。

代码实现:

void ShellSort(int* a, int n)
{assert(a);int gap = n;//不能写成大于0,因为gap的值始终>=1while (gap > 1){//只有gap最后为1,才能保证最后有序//所以这里要加1gap = gap / 3 + 1;//这里只是把插入排序的1换成gap即可//但是这里不是排序完一个分组,再去//排序另一个分组,而是整体只过一遍//这样每次对于每组数据只排一部分//整个循环结束之后,所有组的数据排序完成for (int i = 0; i < n - gap; ++i){int end = i;int tmp = a[end + gap];while (end >= 0 && a[end] > tmp){a[end + gap] = a[end];end -= gap;}a[end + gap] = tmp;}}
}

希尔排序的特性总结:

1. 希尔排序是对直接插入排序的优化。

2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。

3. 希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在好些树中给出的希尔排序的时间复杂度都不固定,一般认为希尔排序的时间复杂度是O(^{_{N^{1.3}}})

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

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

相关文章

二分查找算法介绍(边界值、循环条件、值的变化、二分查找的原理、异常处理)

一、二分查找法原理介绍 二分查找是经典的查找算法之一&#xff0c;其原理也非常简单。 对于已排序的数组&#xff08;假设是整型&#xff0c;如果非整型&#xff0c;如果有排序和大小比较的定义&#xff0c;也可以使用二分查找&#xff09;&#xff0c;我们每次判断中间值与目…

Golang TCP网络编程

文章目录 网络编程介绍TCP网络编程服务器监听客户端连接服务器服务端获取连接向连接中写入数据从连接中读取数据关闭连接/监听器 简易的TCP回声服务器效果展示服务端处理逻辑客户端处理逻辑 网络编程介绍 网络编程介绍 网络编程是指通过计算机网络实现程序间通信的一种编程技术…

三十五、openlayers官网示例Dynamic Data——在地图上加载动态数据形成动画效果

官网demo地址&#xff1a; Dynamic Data 初始化地图 const tileLayer new TileLayer({source: new OSM(),});const map new Map({layers: [tileLayer],target: "map",view: new View({center: [0, 0],zoom: 2,}),}); 创建了三个样式 const imageStyle new Style(…

黑马微服务实用篇知识梳理

1、微服务治理 1.1服务注册与发现Eureka和Nacos a、nacos和eureka&#xff0c;二者都支持服务注册与发现&#xff0c;但nacos还包括了动态配置管理、服务健康监测、动态路由等功能&#xff0c;是更全面的服务管理平台 b、eureka需要独立部署为服务并运行&#xff0c;需要自行搭…

师彼长技以助己(3)逻辑思维

师彼长技以助己&#xff08;3&#xff09;逻辑思维 前言 上一篇文章进行了工程思维和产品思维的测试&#xff0c;并介绍了几个比较重要的产品思维模型。接下来本篇介绍工程思维。&#xff08;注意产品思维并不代表产品经理思维&#xff0c;工程思维也并不代表工程师思维&…

【用户画像】用户偏好购物模型BP

一、前言 用户购物偏好模型BP&#xff08;Buyer Preferences Model&#xff09;旨在通过对用户购物行为的深入分析和建模&#xff0c;以量化用户对不同商品或服务的偏好程度。该模型对于电商平台、零售商以及其他涉及消费者决策的商业实体来说&#xff0c;具有重要的应用价值。…

linux,lseek,append用法

打开写的.c文件 内容为 代码 <sys/stat.h> #include <fcntl.h> #include<stdio.h> #include<unistd.h> #include<string.h>//off_t lseek(int fd, off_t offset, int whence); //int open(const char *pathname, int flags); //int open(const …

二类电商想做爆品还是得会选品

对于二类电商&#xff0c;尤其是电商新手而言&#xff0c;往往很多人都不知道自己该如何选品&#xff0c;在哪里选品&#xff0c;以及如何谈品等等的难题。想要挑选具有潜力的商品&#xff0c;首先我们需要梳理好商品选择的逻辑&#xff1a; 二类电商的特点&#xff1f;你要投…

装机必备——360驱动大师安装教程

装机必备——360驱动大师安装教程 软件下载 软件名称&#xff1a;360驱动大师2.0beta 软件语言&#xff1a;简体中文 软件大小&#xff1a;13.87M系统要求&#xff1a;Windows7或更高&#xff0c; 32/64位操作系统 硬件要求&#xff1a;CPU2GHz &#xff0c;RAM2G或更高 下载…

36【Aseprite 作图】蒸笼盖——拆解

1 蒸笼盖框架 里圈和外圈的形状都是一样的 扶手处&#xff0c;2 1 2 2 2&#xff08;最好都是2&#xff0c;拐角处用1&#xff09; 2 上色 中间的波浪&#xff0c;是2 2 2 上&#xff08;再 2 2 2 下&#xff09; 下方阴影&#xff0c;左边的阴影&#xff0c;右边的阴影颜色…

冯喜运:6.3黄金原油晚间最新行情及独家操作策略指导

【黄金消息面分析】&#xff1a;在全球经济的波动和不确定性中&#xff0c;黄金作为传统的避险资产&#xff0c;其价格走势和市场分析一直是投资者关注的焦点。本周一&#xff08;北京时间6月3日&#xff09;&#xff0c;现货黄金价格基本持平&#xff0c;交易商正在等待本周公…

一个AI板卡电脑--香橙派 AIpro

本文算是一个开箱测评&#xff0c;主要评估它和一个电脑的距离。 香橙派官网&#xff1a;香橙派(Orange Pi)-Orange Pi官网-香橙派开发板,开源硬件,开源软件,开源芯片,电脑键盘香橙派&#xff08;Orange Pi&#xff09;是深圳市迅龙软件有限公司旗下开源产品品牌;香橙派&#x…

抖音小店怎么找厂家代发?从沟通到发货,全流程不容错过!

哈喽~ 我是电商月月 新手做抖音小店&#xff0c;无货源模式的商家不知道怎么找货源&#xff1f; 今天月月就给大家讲解一下抖音小店从找厂家&#xff0c;到和厂家沟通&#xff0c;最后协商发货的方法步骤都有哪些&#xff1f; 满满干货&#xff0c;不容错过&#xff0c;建议…

游戏找不到d3dcompiler43.dll怎么办,分享5种有效的解决方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是找不到某个文件。其中&#xff0c;找不到d3dcompiler43.dll是一个常见的问题。这个问题通常出现在运行某些游戏或应用程序时&#xff0c;由于缺少了d3dcompiler43.dll文件&#xff0c;导致程…

openeuler欧拉系统连不上网,ping百度报错,ping: www.baidu.com: Name or service not known

一、现象 使用华为 openeuler 系统连不上网&#xff0c;ping 百度报如下错误 ↓ ping: www.baidu.com: Name or service not known二、原因 没有配置dns服务器 三、解决办法 进入网络配置文件存放文件夹 cd /etc/sysconfig/network-scripts/查看对应的网口文件 ls ps: 不同系…

C语言:(动态内存管理)

目录 动态内存有什么用呢 malloc函数 开辟失败示范 free函数 calloc函数 realloc函数 当然realooc也可以开辟空间 常⻅的动态内存的错误 对NULL指针的解引⽤操作 对动态内存开辟的空间越界访问 对⾮动态开辟内存使⽤free释放 使⽤free释放⼀块动态开辟内存的⼀部分 …

TCP三次握手四次挥手,滑动窗口

TCP三次握手 TCP&#xff08;传输控制协议&#xff09;是一种重要的网络协议&#xff0c;它属于互联网协议套件中的传输层&#xff0c;主要用于在不可靠的互联网上提供可靠的、有序的和无差错的数据传输。下面详细介绍TCP的工作原理&#xff0c;包括其连接建立的三次握手过程。…

类和对象(下)【初始化列表】【static成员】【友元】等..... .及【练习题】

类和对象&#xff08;下&#xff09; 1.再谈构造函数 1.1构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值。 // 初始化列表 # include<iostream> using namespace std;class Date { public:// 构造…

机器学习第十一次课

前言 从现在开始进入神经网络的领域了 正文 先是一段历史介绍,这个就跳过吧,我觉得这里最重要的就是反向传播这里 反向传播 反向传播&#xff08;Backpropagation&#xff09;是一种训练人工神经网络的算法&#xff0c;它通过计算损失函数关于网络参数的梯度来调整网络参数…

java基础篇(1)

JDK是什么?有哪些内容组成?JDK是Java开发工具包 JVM虚拟机: Java程序运行的地方 核心类库: Java已经写好的东西&#xff0c;我们可以直接用开发工具: javac、java、jdb、jhat.. JRE是什么?有哪些内容组成? JRE是Java运行环境 JVM、核心类库、运行工具 JDK&#xff0c;JRE&…