【排序】直接插入排序和希尔排序

目录

一、排序思想

1、直接插入排序

2、希尔排序

二、代码实现

三、性能比较

四、排序总结

1、直接插入排序

2、希尔排序


一、排序思想

1、直接插入排序

基本思想:把待排序的序列选取一个整数逐个插入到已经排好的有序序列中,直到所有整数都插入到这个有序序列中,得到一个新的有序序列。

2、希尔排序

基本思想:在直接插入排序的基础上进行了优化,选取一个整数gap,把每个距离为gap的数分为一组,并对每一组内的数进行预排序,得到接近有序的序列。更改gap,直到gap==1时,得到一个新的有序序列。

二、代码实现

//直接插入排序
void InsertSort(int* a, int n)
{//先走单趟 再走整体//[0,end]有序,把end+1位置的值插入 保持有序for (int i = 0; i < n - 1; i++){int end=i;int tmp = a[end + 1];while (end >= 0){//排升序if (tmp < a[end]){a[end + 1] = a[end];end--;}else{//只要tmp>=a[end]就跳出循环  break;}}a[end + 1] = tmp;}}
//希尔排序
void ShellSort(int* a, int n)
{int gap = n;while (gap > 1){gap = gap / 3+1;for (int i = 0; i < n - gap; i++){int end = i;int tmp = a[end + gap];while (end >= 0){//排升序if (tmp < a[end]){a[end + gap] = a[end];end-=gap;}else//只要tmp>=a[end]就跳出循环break;}a[end + gap] = tmp;}}}

三、性能比较

//随机生成100000个数,插入到在堆上开辟的数组中,并对该数组进行排序
//测试两个排序所用时间
void TestOP()
{srand(time(0));const int N = 100000;int* a1 = (int*)malloc(sizeof(int) * N);int* a2 = (int*)malloc(sizeof(int) * N);//memset(a1, 0, sizeof(int) * N);for (int i = 0; i < N; i++){a1[i] = rand();a2[i] = a1[i];}int begin1 = clock();InsertSort(a1, N);int end1 = clock();int begin2 = clock();ShellSort(a2, N);int end2 = clock();printf("InsertSort:%d\n", end1 - begin1);printf("ShellSort:%d\n", end2 - begin2);free(a1);free(a2);
}
int main()
{TestOP();return 0;
}//运行结果
InsertSort:3700
ShellSort:16

四、排序总结

1、直接插入排序

<1>、元素集合越接近有序,直接插入排序的时间效率就越高,最坏情况是逆序

<2>、时间复杂度:O(n^2)

<3>、空间复杂度:O(1)

<4>、稳定性:它是一种稳定的排序算法

2、希尔排序

<1>、希尔排序是对直接插入排序的进一步优化,当gap>1时都是进行预排序,目的是让数组更有序,当gap==1时,数组已经接近有序,整体达到对直接插入排序的优化。

<2>、时间复杂度:O(n^1.3)

<3>、空间复杂度:O(1)

<4>、稳定性:它是一种不稳定的排序算法

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

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

相关文章

智加科技获全国首张重卡无人驾驶开放道路测试牌照

2023年12月1日&#xff0c;智加科技获得苏州市智能网联汽车无人化测试牌照。该牌照也是江苏省及国内首张无人重卡开放高速公路全路段全场景全息路网&#xff08;S17苏台高速&#xff09;道路测试牌照。 该重卡无人驾驶开放道路测试牌照&#xff0c;经由苏州市智能网联汽车联席小…

图书整理II(两个栈实现队列)

目录 贼相似题目&#xff1a; 本题题目&#xff1a; 我们直接看题解吧&#xff1a; 审题目事例提示&#xff1a; 解题分析&#xff1a; 解题思路&#xff1a; 代码实现&#xff1a; 代码补充说明&#xff1a; 力扣题目地址&#xff1a; LCR 125. 图书整理 II - 力扣&#xff0…

基于深度学习面向中医诊断的舌象图像分割系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 中医舌诊是通过观察舌的各种特征来了解人体的健康状况&#xff0c;从而对各种疾病做出诊断及病情评估&#xff0c;是传统中国医学应用最广、最有价值的诊法之一。…

如何在没有备份的情况下从 Android 手机恢复已删除的数据

电话数据对我们至关重要。我们可以更换我们使用的设备&#xff0c;但不能更换我们的数据。我们以前一直使用CD、USB 和硬盘来保存数据。随着技术的出现&#xff0c;我们遇到了云存储。我们可以随时随地、任意次数地访问存储。所有操作系统都有数据云&#xff0c;可以用来保存图…

docker容器内部文件挂载主机

docker images执行该命令可以发现一个centos镜像 docker run --namemycentos -itd --privilegedtrue --restartalways -p 88:80 -v C:\Users\Administrator\Desktop\dockerTest:/bin/gh:ro centosdocker run 命令用于在 Docker 上创建和运行容器。 --namemycentos 指定容器…

【面试HOT200】回溯篇

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于【CodeTopHot300】进行的&#xff0c;每个知识点的修正和深入主要参…

PAD平板签约投屏软件要如何选

又是一年年底了&#xff0c;年会开始多起来了&#xff0c;许多会务公司或活动公司会接到很多平板签约投屏业务&#xff0c;如年会中的签军令状、业绩保证书等。这时就面临选购一套签约投屏软件了。 目前的签约投屏软件&#xff0c;大多以H5做的网页版的多&#xff0c;但我建议…

Web安全漏洞分析-XSS(中)

随着互联网的迅猛发展&#xff0c;Web应用的普及程度也愈发广泛。然而&#xff0c;随之而来的是各种安全威胁的不断涌现&#xff0c;其中最为常见而危险的之一就是跨站脚本攻击&#xff08;Cross-Site Scripting&#xff0c;简称XSS&#xff09;。XSS攻击一直以来都是Web安全领…

RocketMQ消息过滤机制源码详解

#RocketMQ提供了2种消息过滤的方式&#xff1a; TAG 过滤 SQL92 过滤 SQL过滤默认是没有打开的&#xff0c;如果想要支持&#xff0c;必须在broker的配置文件中设置&#xff1a;enablePropertyFilter true 一. 示例代码 1.1 producer 代码 public class Producer {public …

实战系统玩转OpenGL和AI,助力实现各种高级酷炫视频特效几个技巧

随着计算机图形学和人工智能的发展&#xff0c;通过将OpenGL和AI相结合&#xff0c;我们可以实现各种令人印象深刻的高级酷炫视频特效。本文将介绍几个技巧&#xff0c;帮助您在实践中更好地应用这些技术&#xff0c;并附上相应的源码。 火焰效果: 利用OpenGL的纹理映射和着色器…

程序员学习方法

https://www.zhihu.com/question/24187324 https://www.zhihu.com/question/505750740 windows系统&#xff1a; 如何业余开展 Windows 系统的学习&#xff1f; - 知乎 wifi工作原理&#xff1a; WiFi的工作原理是什么&#xff1f; - 知乎 发

LLM:《第 3 部分》从数学角度评估封闭式LLM的泛化能力

一、说明 在 OpenAI 或 Anthropic 等封闭式大型语言模型 (LLM) 领域&#xff0c;对智能和多功能性的真正考验在于它们处理高特异性查询并在响应中表现出独特性的能力。在这篇博客中&#xff0c;我的目标是提供测试这些模型泛化能力的机制。 封闭式LLM意味着您不知道训练语料库的…

ORA-00257: archiver error. Connect internal only, until freed 处理方法

1、产生原因 通过PL/SQL登录用户账号提示此信息&#xff0c;导致无法正常登录&#xff0c;查询资料显示出现ORA-00257错误由于归档日志已满&#xff0c;占用了全部的硬盘剩余空间导致的&#xff0c;通过简单删除日志释放存储空间就能够解决。 2、解决办法 2.1 root用户登录服务…

【java智慧工地源码】智慧工地物联网云平台,实现现场各类工况数据采集、存储、分析与应用

“智慧工地整体方案”以智慧工地物联网云平台为核心&#xff0c;基于智慧工地物联网云平台与现场多个子系统的互联&#xff0c;实现现场各类工况数据采集、存储、分析与应用。通过接入智慧工地物联网云平台的多个子系统板块&#xff0c;根据现场管理实际需求灵活组合&#xff0…

设计模式--观察者模式(Observer Pattern)

Observer模式 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了对象之间的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都会得到通知并被自动更新。 观察者模式主要包含以下几个角色&#xff1…

SSM SpringBoot vue社团事务管理系统

SSM SpringBoot vue社团事务管理系统 系统功能 登录 个人中心 人员信息管理 考勤信息管理 空闲时间管理 现金日记账管理 经费预算管理 物品租借管理 会议信息管理 活动信息管理 项目任务管理 公告通知管理 物资信息管理 开发环境和技术 开发语言&#xff1a;Java 使用框架:…

面试题:千万量级数据中查询 10W 量级的数据有什么方案?

文章目录 前言初版设计方案整体方案设计为&#xff1a;技术方案如下&#xff1a;CK 分页查询使用 ES Scroll Scan 优化深翻页耗时数据 ESHbase 组合查询方案ES 查询的两个阶段组合使用 Hbase RediSearchRedisJSON 优化方案RediSearch 性能数据RedisJSON 性能数据 总结 前言 在…

基于windows系统使用Python对于pc当前的所有窗口的相关操作接口

对于windows系统的电脑使用Python可以对其当前的窗口进行宏观的查询等操作 派生博客1:python对pc的窗口进行操作(windows) 派生博客2python获取当前pc的分辨率(windows) 派生博客3使用uiautomation模块来对基于windows系统的pc中的前端界面进行自动化测试(查找控件&#xff…

【msg_msg】corCTF2021-msgmsg 套题

前言 该套题共两题&#xff0c;一道简单模式 fire_of_salvation&#xff0c;一道困难模式 wall_of_perdition&#xff0c;都是关于 msg_msg 的利用的。这题跟之前的 TPCTF2023 core 的很像&#xff08;应该是 TPCTF2023 core 跟他很像&#xff0c;bushi&#xff09;。 其中 f…

C#编程题分享(5)

判断质数问题 输⼊⼀个正整数&#xff0c;判断该数是否是质数。如果为质数输出 yes&#xff0c;如果不是输出no 样例输⼊113 输出yes int n Convert.ToInt32(Console.ReadLine()); int count 0; for (int i 1; i < n 1; i) {if (n % i 0) // 判断该数能被整除{coun…