排序-插入排序与希尔排序

文章目录

    • 一、插入排序
    • 二、希尔排序


一、插入排序

思路:

当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移

如:
在这里插入图片描述
代码实现:

void  test(int arr[],int size) {int ned ;//定义一个插入数据的前一个数据的下标for (int i = 0; i < size-1; i++) {ned = i;//从第一个开始int t = arr[ned + 1];//需要插入的数据while (ned >= 0)//当遍历到最后一个结束{if (arr[ned] > t)//比插入数据大就插入{arr[ned + 1] = arr[ned];//往后移动一位ned--;//--找下一个数据}else//找到比t小的结束break;}arr[ned + 1] = t;//在比t小的数据前一位插入
//这样就算那个数是最小的我,和下标为0那个位置比完后,ned=-1,
//我们也可以插入到下标为0 的位置}
}
void Print(int arr[], int size) {for (int i = 0; i < size; i++)printf("%d ", arr[i]);printf("\n");
}
int main() {int arr[] = { 8,6,9,3,5,1,0,4,2,7 };Print(arr, sizeof(arr) / sizeof(arr[0]));test(arr, sizeof(arr)/sizeof(arr[0]));Print(arr, sizeof(arr) / sizeof(arr[0]));return 0}

运行结果:
在这里插入图片描述
时间复杂度:
第一层循环怎么都要走N次,第二层循环最好的结果为(已经排好序),为1次,
最坏的结果,(与想要的顺序相反),为N次
我们取最坏的结果,N ^ N次,所以时间复杂度O(N^N).

二、希尔排序

思路:
1.实质上还是使用插入排序的思想
2.我们将数组的数据进行分组排序,每间隔 gap 的为一组,这些排序叫做预排序,设置多组间隔为 gap ,经过预排序的数组就会接近有序
如:
![![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/53092304050a4955ad0445ca63ea531e.png](https://img-blog.csdnimg.cn/direct/29136b20dfef4dad9aa57f09367c721c.png

3.那么这个 gap 怎么设置呢?,我们知道,当gap=1时就是相当于直接插入排序,因此我们可以这样设置,就是gap 由大到小,最后到1,结束
4.gap设置的特点
gap越大,大的数可以越快排到后面,小的数可以越快的排到前面,但是预排完,不是那么接近有序
gap越小 越接近有序
gap=1,就是直接插入排序
如:
在这里插入图片描述

代码实现:

void test1(int arr[], int size) {int gap = size;//设为数据的个数int ned = 0;while (gap!= 1)//结束条件;当gap=1时{gap = gap / 3 + 1;//除三或者二都可,每次都会减少,加1保证有一次gap=1//每间隔gap的数据就进行一次插入排序//结束条件:当i+gap>n时for (int i = 0; i < size - gap; i++){//以下和我们上面的插入排序一样ned = i;int t = arr[ned + f];while (ned >= 0) {if (arr[ned] > t) {arr[ned + gap] = arr[ned];ned -= gap;}elsebreak;}arr[ned + gap] = t;}}
}
void Print(int arr[], int size) {for (int i = 0; i < size; i++)printf("%d ", arr[i]);printf("\n");
}int main() {int arr[] = { 8,6,9,3,5,1,0,4,2,7 };Print(arr, sizeof(arr) / sizeof(arr[0]));test1(arr, sizeof(arr) / sizeof(arr[0]));Print(arr, sizeof(arr) / sizeof(arr[0]));return 0;
}

运行结果:
在这里插入图片描述
时间复杂度:
第一次循环每次除3就是,以3为底的logN,
当gap很大时,因为循环的次数减少,所以后两层循环的次数很接近N
当gap很小时,因为已经接近有序了,所以循环的次数也接近N
所以时间复杂度为 O(lonN*N)(以3为底的logN)
当然这只时估算的结果,不一定准确
严蔚敏老师他的数据结构这本书上是:O(N^1.3)

以上就是我的分享了,如果有什么错误,欢迎在评论区留言。
最后,谢谢大家的观看!

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

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

相关文章

基于Springboot+mybatis+mysql+jsp招聘网站

基于Springbootmybatismysqljsp招聘网站 一、系统介绍二、功能展示四、其他系统实现五、获取源码 一、系统介绍 项目类型&#xff1a;Java EE项目 项目名称&#xff1a;基于SPringBoot的照片网站 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 前端技术&…

Swagger Array 逐步解密:带你简化开发工作

Swagger 允许开发者定义 API 的路径、请求参数、响应和其他相关信息&#xff0c;以便生成可读性较高的文档和自动生成客户端代码。而 Array &#xff08;数组&#xff09;是一种常见的数据结构&#xff0c;用于存储和组织多个相同类型的数据元素。数组可以有不同的维度和大小&a…

轨道电流检测IC——FP355,助力蓄电池充电器、SPS(适配器)、电池管理系统、多口快充充电器的优雅升级

目录 一、FP355概述 二、FP355特点 三、FP355应用 随着移动设备的普及和人们对电力需求的不断增长&#xff0c;充电器的安全性和充电效率成为了重要的关注点。 作为一种能够精确检测电流的集成电路&#xff0c;轨道电流检测IC——FP355是个不错的选择。它不仅广泛应用于蓄电…

SpringBoot集成Spring Security+jwt+kaptcha验证(简单实现,可根据实际修改逻辑)

参考文章 【全网最细致】SpringBoot整合Spring Security JWT实现用户认证 需求 结合jwt实现登录功能&#xff0c;采用自带/login接口实现权限控制 熟悉下SpringSecurity SpringSecurity 采用的是责任链的设计模式&#xff0c;是一堆过滤器链的组合&#xff0c;它有一条很…

03_W5500TCP_Client

上一节我们完成了W5500网络的初始化过程&#xff0c;这节我们进行TCP通信&#xff0c;w5500作为TCP客户端与电脑端的TCP_Server进行通信。 目录 1.TCP通信流程图&#xff1a; tcp的三次握手&#xff1a; tcp四次挥手&#xff1a; 2.代码分析&#xff1a; 3.测试&#xff1a…

Python游戏测试工具自动化遍历游戏中所有关卡

场景 游戏里有很多关卡&#xff08;可能有几百个了&#xff09;&#xff0c;理论上每次发布到外网前都要遍历各关卡看看会不会有异常&#xff0c;上次就有玩家在打某个关卡时卡住不动了&#xff0c;如果每个关卡要人工遍历这样做会非常的耗时&#xff0c;所以考虑用自动化的方…

AI专题报告:2022年中国人工智能产业研究报告

今天分享的AI系列深度研究报告&#xff1a;《AI专题报告&#xff1a;2022年中国人工智能产业研究报告》。 &#xff08;报告出品方&#xff1a;艾瑞咨询&#xff09; 报告共计&#xff1a;112页 人工智能参与社会建设的千行百业 价值性、通用性、效率化为产业发展战略方向 …

淘宝API接口系列丨商品详情数据接口丨关键词搜索商品列表接口丨商品评论,销量接口

要对接淘宝API接口&#xff0c;可以按照以下步骤进行操作&#xff1a; 注册成为淘宝开放平台开发者&#xff0c;并创建一个应用。在应用创建页面&#xff0c;需要填写应用的名称、描述等信息&#xff0c;并设置应用的API权限等级。获取App Key和App Secret。在应用创建后&…

jira创建用例,与任务关联

项目用的jira&#xff0c;但之前的用例放在禅道上&#xff0c;或者归档于svn&#xff0c;都不是很好用&#xff0c;所以研究了下jira的用法 1、下载插件&#xff1a; synapseRT - Test management and QA in JIRA 完成后在tab会多出一个test 2、常用的功能 1、建立用例&#…

Gitlab+GitlabRunner搭建CICD自动化流水线将应用部署上Kubernetes

文章目录 安装Gitlab服务器准备安装版本安装依赖和暴露端口安装Gitlab修改Gitlab配置文件访问Gitlab 安装Gitlab Runner服务器准备安装版本安装依赖安装Gitlab Runner安装打包工具安装docker安装java17安装maven 注册Gitlab Runner 搭建自动化部署准备SpringBoot项目添加一个Co…

验证码的多种生成策略

&#x1f60a; 作者&#xff1a; 瓶盖子io &#x1f496; 主页&#xff1a; 瓶盖子io-CSDN博客 第一种 a.导入依赖 <dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.10</ver…

zxjy003- Spring Cloud后端工程搭建

1、创建 sprigboot 工程 guli-parent groupId &#xff1a; com.atguigu artifactId &#xff1a; guli-parent 2.删除src目录 3.配置pom.xml 修改版本为 &#xff1a;2.2.1.RELEASE<artifactId> 节点后面添加 pom类型 全部依赖&#xff0c;复制下面的即可&#xff0c…

素材创作平台,解决企业素材供给问题

企业对于高质量素材的需求日益增长。无论是为了提升品牌形象&#xff0c;还是为了推动产品销售&#xff0c;都需要大量的专业设计素材。然而&#xff0c;素材的获取、设计和定制往往是一项耗时耗力的工作。这时&#xff0c;美摄科技素材创作平台应运而生&#xff0c;为企业提供…

从0到1,手把手带你开发截图工具ScreenCap------001实现基本的截图功能

ScreenCap---Version&#xff1a;001 说明 从0到1&#xff0c;手把手带你开发windows端的截屏软件ScreenCap 当前版本&#xff1a;ScreenCap---001 支持全屏截图 支持鼠标拖动截图区域 支持拖拽截图 支持保存全屏截图 支持另存截图到其他位置 GitHub 仓库master下的Scr…

C++新经典模板与泛型编程:用成员函数重载实现std::is_convertible

用成员函数重载实现is_convertible C标准库中提供的可变参类模板std::is_convertible&#xff0c;这个类模板的主要能力是判断能否从某个类型隐式地转换到另一个类型&#xff0c;返回的是一个布尔值true或false。例如&#xff0c;一般的从int转换成float或从float转换成int&am…

使用Plex结合cpolar搭建本地私人媒体站并实现远程访问

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 用手机或者平板电脑看视频&#xff0c;已经算是生活中稀松平常的场景了&#xff0c;特别是各…

剧本杀小程序搭建:打造线上剧本杀新体验

剧本杀是一款以角色扮演为主的游戏&#xff0c;一度成为了年轻人的最喜爱的社交游戏。在剧本杀市场需求下&#xff0c;剧本杀规模也迅速上升。今年第一季度&#xff0c;剧本杀市场规模环比增长47%&#xff0c;市场整体消费水平逐渐呈上升趋势。 随着剧本杀的不断发展&#xff…

echarts绘制一个环形图2

其他echarts&#xff1a; echarts绘制一个环形图 echarts绘制一个柱状图&#xff0c;柱状折线图 echarts绘制一个饼图 效果&#xff1a; 组件代码&#xff1a; <template><div class"wrapper"><div ref"doughnutChart2" id"dough…

ORACLE数据库实验总集 实验六 SQL 语句应用

一、 实验目的 &#xff08;1&#xff09; 掌握数据的插入&#xff08;INSERT&#xff09;、 修改&#xff08;UPDATE&#xff09; 和删除&#xff08;DELETE&#xff09; 操作。 &#xff08;2&#xff09; 掌握不同类型的数据查询&#xff08;SELECT&#xff09; 操作。 二、…

JVM虚拟机:如何查看JVM初始和最终的参数?

本文重点 在前面的课程中&#xff0c;我们学习了如何查看当前程序所处于的xx参数&#xff0c;本文再介绍一种如何参看JVM的xx参数&#xff1f; 查看JVM的所有初始化参数 方式一&#xff1a;java -XX:PrintFlagsInitial 方式二&#xff1a;java -XX:PrintFlagsInitial -versio…