【数据结构】排序(一)—— 希尔排序(思路演进版)

目录

一、常见的排序算法分类

二、常见排序算法的实现 

2.1插入排序

2.1.1基本思想

2.1.2直接插入排序

思路

step1.单趟控制

step2.总体控制 

代码实现

测试

特性总结

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

基本思想

思路演进

🌈1.代码实现单组排序(以红色组为例)

🌈2.加入控制多组排序的代码

🌈3.对上面代码修改 ,一组一组排 改为 多组并排!!!

🌈4.最后考虑,如何控制gap?

最终代码实现

测试

特性总结

三、结语


一、常见的排序算法分类

二、常见排序算法的实现 

2.1插入排序

2.1.1基本思想

直接插入排序是一种简单的插入排序法,其基本思想是:

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

 2.1.2直接插入排序

思路
step1.单趟控制

先考虑单趟排序,暂时不考虑区间到底是从哪到哪 ,先抽象为[0,end]

假设[0,end]是有序的区间 a[end+1] 插入到 [0,end]中

具体如何插入:

下标是end+1的元素依次跟[0,end]区间中的元素作比较:

end+1先跟end比 再跟 end-1比较......依次往下

如果a[end+1]<a[end] 以排升序为例子 ,那么a[end]就往后挪动 也就是往后覆盖

如果a[end+1]>a[end] ,那么就停止比较 ,a[end+1] 插入到 [0,end]中

❓思路落实到代码:

用临时变量tmp 先保存a[end+1],最终插入的位置也是a[end+1]

step2.总体控制 

接下来考虑如何控制[0,end]区间大小的变化:

执行过程描述:

初始时 区间元素个数肯定只有一个,

也就是end = 0 ,区间[0,0]有序,只有一个元素a[0],然后a[1]往里插入,

完成后,end = 1,区间[0,1]有序,有两个元素,a[2]往里插入...

直到整个数组元素都有序,排序完成。

❓思路落实到代码:

执行过程中,我们发现,end的值不断变化的,所以加入外层循环变量i控制即可!

代码实现
void InsertSort(int* a, int n)
{//外层循环 控制 多趟[0,end]for (int i = 0; i < n-1; i++){//单趟//[0,end] end+1 插入 [0,end]int end = i;int tmp = a[end + 1];while (end >= 0){//升序if (tmp < a[end]){//end 往后覆盖 end+1a[end + 1] = a[end];end--;}else{break;}}a[end + 1] = tmp;}
}
测试

特性总结

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

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

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

4. 稳定性:稳定

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

基本思想

希尔排序法又称缩小增量法。希尔排序法的基本思想是:

先选定一个整数gap,把待排序文件中所有记录分成多个组,所有距离为gap的记录分在同一组内,并对每一组内的记录进行排序。然后,再往后依次取 间隔为gap的记录,重复上述分组和排序的工作。当gap==1时,所有记录在统一组内排好序。

思路演进

总体思路:

1、预排序:分别对每个分组进行插入排序

2、直接插入排序 :保证最终结果是有序的

先选定一个整数 ,先假设 gap = 3.  图解

🌈1.代码实现单组排序(以红色组为例)

🌈2.加入控制多组排序的代码

总体有gap组 排完红色组 接着排 蓝色组、绿色组 则需要再加入一层循环控制

j==0 红色组 插入排序

j==1 蓝色组 插入排序

j==2 绿色组 插入排序

🌈3.对上面代码修改 ,一组一组排 改为 多组并排!!!

上面代码是 : 红色组排完 排绿色组  绿色排完 排蓝色组

下面代码是 : 红色组第一个位置排好,

                        i++ 排蓝色组第一个位置 ,

                       再 i++ 排绿色组第一个位置

                       以此类推......

 实现多组并排:

🌈4.最后考虑,如何控制gap?

gap越大:小的值更快调到前面,大的值更快调到后面

gap越小:调得越慢 但 越接近有序

gap==1 :就是直接插入排序

所以我们再加入一层循环 控制gap

最终代码实现
void ShellSort(int* a, int n)
{int gap = n;while (gap > 1){gap = gap / 2 ;for (int i = 0; i < n - gap; i ++){//单趟//[0,end] end+gap 插入 [0,end]int end = i;int tmp = a[end + gap];while (end >= 0){//升序if (tmp < a[end]){//end 往后覆盖a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}
}
测试

特性总结

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

2. 当gap > 1时都是预排序,目的是让数组接近于有序

    当gap == 1时,数组已经是接近有序,再进行直接插入排序,目的是让数组有序

    这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。

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

三、结语

插入排序就先讲到这里,后面滴选择、交换、归并排序,都会快快更新滴~

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

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

相关文章

端午节线上活动方案怎么写?

一年一端午&#xff0c;一岁一安康。 如果您想组织端午活动&#xff0c;却不知道如何安排&#xff0c;可以看看何策网&#xff0c;有很多案例参考&#xff0c;仿造模板修改即可。 下面分享一个线上端午节活动策划方案&#xff0c;希望能帮到你&#xff01; 端午节作为祭祖祈…

mysql集群NDBcluster引擎在写入数据时报错 (1114, “The table ‘ads‘ is full“)

问题描述&#xff1a;mysql集群在写入数据时&#xff0c;出现上述报错 问题原因&#xff1a;表数据已满&#xff0c;一般是在集群的管理节点设置里面datamemory的值太小&#xff0c;当数据量超过该值时就会出现该问题 解决方案&#xff1a; 修改集群管理节点的config.ini里面…

ICode国际青少年编程竞赛- Python-4级训练场-嵌套for循环练习2

ICode国际青少年编程竞赛- Python-4级训练场-嵌套for循环练习2 1、 for i in range(3):Dev.turnRight()for j in range(3):Dev.step(-3)Dev.turnRight()Dev.step(4-2*i)2、 for i in range(6):for j in range(2):Dev.step(2 2 * i)if i > 3: Dev.step(i - 2)Dev.turnRi…

C++小程序:同一路由器下两台计算机间简单通信(2/2)——客户端

客户端的程序结构前半部分与服务器端基本相同&#xff0c;后半部分也相对简单。相关函数的解释可以参考前文服务器端的内容。有关客户端的内容除个别地方外&#xff0c;就不再做长篇大论的解释。强调一点&#xff0c;如果将此程序移到其它电脑上运行&#xff0c;编译需要releas…

Ciphey无法安装的解决办法

安装过程纯属自己实践&#xff0c;满满干货 困扰我几天的问题终于解决了 我看着教程在window上安装 python3.8/python3.9/python3.10无论如何都安装不上&#xff0c; 在win10虚拟机仍然安装不上 可能是我电脑环境问题 解决办法&#xff1a; 在kali中安装&#xff0c;但是…

第13节 第二种shellcode编写实战(2)

在第二种shellcode编写实战(1)的基础上&#xff0c;新增加一个CAPI类&#xff0c;将所有用到的函数都在这个类中做动态调用的处理&#xff0c;这样使得整个shellcode功能结构更加清晰。 1. 新建类CAPI&#xff08;即api.h和api.cpp两个文件&#xff09;&#xff1a; api.h&…

flutter自定义日期选择器按日、按月、自定义开始、结束时间

导入包flutter_datetime_picker: 1.5.0 封装 import package:atui/jade/utils/JadeColors.dart; import package:flutter/cupertino.dart; import package:flutter/material.dart; import package:flutter_datetime_picker/flutter_datetime_picker.dart; import package:flut…

景源畅信电商:经营抖店需要电脑吗?

经营抖店是否需要电脑?这个问题看似简单&#xff0c;实则关乎着商家的运营效率和成本投入。在当前数字化、网络化的商业环境中&#xff0c;电脑已经成为了不可或缺的工具。那么&#xff0c;经营抖店究竟是否需要电脑呢?答案是肯定的。 一、高效处理订单 电脑能够高效地处理大…

如何在湖师大官网找到考研真题

今天学弟问我怎么找真题&#xff0c;我必须告诉他怎么找湖师大的真题&#xff0c;身为考研学子&#xff0c;这是必须要知道滴&#xff0c;尤其是自命题&#xff0c;是吧&#xff0c;话不多说&#xff0c;言归正传&#xff0c;我们开始吧&#xff01; 1 打开湖师大官网 什么&a…

树莓派nmap扫描

debian系统安装nmap&#xff1a; sudo apt install nmap安装nmap完成后&#xff0c;输入 ip route 来查看当前Wi-Fi路由器的ip地址。 第一行的default via后显示的便是网关地址&#xff0c;也就是路由器地址。 获取到路由器ip地址后&#xff0c;在终端中输入&#xff1a; …

一站式HMI软件开发套件eStation,让开发更简单高效

4月份举办的北京国际车展上全球首发车117辆&#xff0c;新能源车型278个&#xff0c;越来越多的车厂通过差异化和改善UI/UE体验&#xff0c;来获取更多用户的青睐。为快速响应差异化竞争需求&#xff0c;智能座舱HMI市场遇到以下挑战&#xff1a; 如何兼容不同项目开发人员编程…

力扣例题(用栈实现队列)

目录 链接. - 力扣&#xff08;LeetCode&#xff09; 描述 思路 push pop peek empty 代码 链接. - 力扣&#xff08;LeetCode&#xff09; 描述 思路 push 例如我们将10个元素放入栈中&#xff0c;假设最左边为栈顶&#xff0c;最右侧为栈底 则为10,9,8,7,6,5,4,3,…

嵌入式 - GPIO编程简介

An Introduction to GPIO Programming By Jeff Tranter Wednesday, June 12, 2019 编者按&#xff1a;本 2019 年博客系列是 ICS 最受欢迎的系列之一&#xff0c;现已更新&#xff08;2022 年 12 月&#xff09;&#xff0c;以确保内容仍然准确、相关和有用。 本博客是 Integr…

图片转word如何转换?

要将图片转换为Word文档&#xff0c;你可以使用以下方法之一&#xff1a; 以上这些方法都可以帮助你将图片中的文本转换为可编辑的Word文档&#xff0c;你可以根据自己的喜好和需求选择其中一种方法来操作。 使用OCR软件或在线工具&#xff1a;有许多OCR&#xff08;Optical Ch…

电子资源|基于SSM+vue的电子资源管理系统(源码+数据库+文档)​

电子资源管理系统 目录 基于SSMvue的电子资源管理系统 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 5.2.1管理员功能模块 5.2.2用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&am…

【Qt 学习笔记】Qt常用控件 | 多元素控件 | Tree Widget的说明及介绍

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 多元素控件 | Tree Widget的说明及介绍 文章编号&#x…

python代码实现TF-IDF

1、TF-IDF解释 TF-IDF&#xff08;Term frequency–inverse document frequency&#xff09;&#xff0c;中文翻译就是词频 - 逆文档频率&#xff0c;是一种用来计算关键词的传统方法。 TF&#xff08;Term Frequency&#xff09;&#xff1a;TF 的意思就是词频&#xff0c;是…

SQL Server共享功能目录显示灰色无法自行选择

SQL Server共享功能目录显示灰色无法自行调整 一、 将之前安装SQL Server卸载干净 二、 清空注册表 1. 打开注册表&#xff0c;winR&#xff0c;输入regedit 2. 注册表-》编辑-》查找&#xff0c;输入C:\Program Files\Microsoft SQL Server\ 3. 注册表-》编辑-》查找&#x…

docker+nginx+Jenkins自动构建

文章目录 前言一、实操记录问下AI&#xff1a;jenkins 配置新增一个mobilegit配置Build TriggersBuild EnvironmentBuild StepsPost-build Actions 上面一顿配置下来&#xff0c;构建 -- FAILURE 总结 前言 在已有docker-Jenkins-nginx 部署方案上&#xff0c;在另外一台测试…

C++实现一个简单的控制cpu利用率的程序

写一个程序&#xff0c;让控制cpu利用率在20%左右 思路很简单&#xff1a;每个循环控制sleep的时间占比 #include <iostream> #include <chrono> #include <unistd.h>int main() {int ratio 20;int base_time 1000;int sleeptime base_time * (100-ratio…