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

文章目录

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


一、插入排序

思路:

当插入第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.hqwc.cn/news/258230.html

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

相关文章

导入自定义模块出现红色波浪线,但是能正常执行

问题描述&#xff1a; 导入自己定义的模块时&#xff0c;出现红色波浪线&#xff0c;可以继续执行 解决&#xff1a; 在存放当前执行文件的文件夹右键&#xff0c;然后将其设置为sources root即可 结果&#xff1a;

什么是Active Directory 中的复制

AD 复制使更新的AD信息在所有 DC 中可用&#xff0c;从最简单的意义上讲&#xff0c;复制是在一个 DC 上修改 AD 对象的概念&#xff0c;然后将其复制并在 AD 林的所有其他 DC 上可见。 AD 环境有许多实时发生的不断变化&#xff0c;这些更改必须在 AD 数据库中更新&#xff0…

十一、了解分布式计算

1、什么是&#xff08;数据&#xff09;计算&#xff1f; 2、分布式(数据)计算 &#xff08;1&#xff09;概念 顾名思义&#xff0c;分布式计算&#xff0c;即以分布式的形式完成数据的统计&#xff0c;得到需要的结果。 分布式数据计算&#xff0c;顾名思义&#xff0c;就是…

学习记录---kubernetes中备份和恢复etcd

一、简介 ETCD是kubernetes的重要组成部分&#xff0c;它主要用于存储kubernetes的所有元数据&#xff0c;我们在kubernetes中的所有资源(node、pod、deployment、service等)&#xff0c;如果该组件出现问题&#xff0c;则可能会导致kubernetes无法使用、资源丢失等情况。因此…

某校园报名sign解密

某校园报名sign解密 定位 看了下确实是md5标准算法&#xff0c;接下来就看下加密的明文了 最后分开看了下&#xff0c; sign md5(用户名 活动id 10位时间戳 keys)

震坤行:ZKH清洁系列打造民族品牌之光

震坤行&#xff1a;ZKH清洁系列打造民族品牌之光 2023年7月&#xff0c;继第一代高性能垃圾袋系列产品面世&#xff0c;震坤行低碳物业型垃圾袋和分类垃圾桶系列产品全面上线&#xff0c;也标志着震坤行清洁类产品正式进入2.0深度开发时代。 震坤行品牌的发展与升级之路 回顾震…

都2023年了还在搜索Maven是什么?赶紧来学习(超详细一文搞懂)

文章目录 前言1. 到底什么是 Maven2. 为什么要学Maven3. 创建一个 Maven 项目4. Maven 核心功能4.1 项目构建4.2 依赖管理 4. Maven 仓库4.1 本地仓库4.2 中央仓库4.3 私有服务器, 也称为私服 5. Maven 设置国内源5.1 配置当前项目setting5.2 设置新项目的setting 总结 前言 我…

MySQL高级--01_1--数据库缓冲池(buffer pool)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 数据库缓冲池(buffer pool)DBMS 会申请占用内存来作为数据缓冲池&#xff0c;在真正访问页面之前&#xff0c;需要把在磁盘上的页缓存到内存中的Buffer Pool 之后才…

如何快速完成企业私有云部署

快解析赋能企业私有云部署 ​ 很多企业形成了以总部为中心的多点生产体系结构&#xff0c;并借助网络化办公工具搭建跨区域协同办公系统&#xff0c;满足总部与分支机构间的信息互通&#xff0c;进而促进异地业务的信息共享&#xff0c;提高办公处理效率和综合管理水平。 北…

blog目录,全用GTP写的代码,一步步完善需求。

GTP真是好用&#xff0c;直接对话&#xff0c;一步步完善需求&#xff0c;写代码无忧。Question&#xff1a;网站文章添加个目录导航的代码。 <p><span style"line-height:1;"><span style"font-size:16px;"><u><a href"h…

echarts绘制一个柱状折线图

其他echarts&#xff1a; echarts绘制一个环形图 echarts绘制一个饼图 echarts绘制一个环形图2 效果&#xff1a; 代码&#xff1a; <template><div class"wrapper"><!-- 柱状图 --><div v-if"type new_bar" ref"barChar…