C++希尔排序是什么
发表于:2025-11-10 作者:千家信息网编辑
千家信息网最后更新 2025年11月10日,本篇内容介绍了"C++希尔排序是什么"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!希尔排序前面的算法
千家信息网最后更新 2025年11月10日C++希尔排序是什么
本篇内容介绍了"C++希尔排序是什么"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
希尔排序
前面的算法的平均效率都不怎么好,但我们注意到直插排序在关键码基本有序的情况下,效率是***的,并且,在关键码的数量很少的时候,n和n2的差距也不是那么的明显。基于以上的事实,D.L.Shell在1959年(老古董了)提出了缩小增量排序,基本思想是:取一个间隔(gap),将序列分成若干的子序列,对每个子序列进行直插排序;然后逐渐缩小间隔,重复以上过程,直到间隔为1。在开始的时候,每个子序列里关键码很少,直插的效率很高;随着间隔的缩小,子序列的关键码越来越多,但是在前面的排序基础上,关键码已经基本有序,直插的效率依然很高。
希尔排序的时间复杂度不好估量,gap的选取也没有定论,gap=[gap/2]的程序是***写的,至于为什么,写写就知道了。
templatevoid ShellSort(T a[], int N, int& KCN, int& RMN) { KCN = 0; RMN = 0; for (int gap = N/2; gap; gap = gap/2) for (int i = gap; i < N; i++) { T temp = a[i]; RMN++; for (int j = i; j >= gap && ++KCN && temp < a[j - gap]; j -= gap) { a[j] = a[j - gap]; RMN++; } a[j] = temp; RMN++; } }
测试结果:
Sort ascending N=10000 TimeSpared: 0ms KCN=120005 KCN/N=12.0005 KCN/N^2=0.00120005 KCN/NlogN=0.903128 RMN=240010 RMN/N=24.001 RMN/N^2=0.0024001 RMN/NlogN=1.80626 Sort randomness N=10000 TimeSpared: 10ms KCN=258935 KCN/N=25.8935 KCN/N^2=0.00258935 KCN/NlogN=1.94868 RMN=383849 RMN/N=38.3849 RMN/N^2=0.00383849 RMN/NlogN=2.88875 Sort descending N=10000 TimeSpared: 10ms KCN=172578 KCN/N=17.2578 KCN/N^2=0.00172578 KCN/NlogN=1.29878 RMN=302570 RMN/N=30.257 RMN/N^2=0.0030257 RMN/NlogN=2.27707
注意到这时的测试结果很不准确了,10000个整数的排序已经测试不出什么来了(估计新机器都是0ms,我这里也有个别的时候全是0)。因此,下面用100000个整数的排序重新测试了一次:
Sort ascending N=100000 TimeSpared: 140ms KCN=1500006 KCN/N=15.0001 KCN/N^2=0.000150001KCN/NlogN=0.903094 RMN=3000012 RMN/N=30.0001 RMN/N^2=0.000300001RMN/NlogN=1.80619 Sort randomness N=100000 TimeSpared: 230ms KCN=4041917 KCN/N=40.4192 KCN/N^2=0.000404192KCN/NlogN=2.43348 RMN=5598883 RMN/N=55.9888 RMN/N^2=0.000559888RMN/NlogN=3.37086 Sort descending N=100000 TimeSpared: 151ms KCN=2244585 KCN/N=22.4459 KCN/N^2=0.000224459KCN/NlogN=1.35137 RMN=3844572 RMN/N=38.4457 RMN/N^2=0.000384457RMN/NlogN=2.31466
这个结果表明,希尔排序几乎没有最坏情况,无论是正序、逆序、乱序,所用时间都不是很多,附加储存是O(1),的确非常不错。在没搞清楚快速排序、堆排序之前,它的确是个很好的选择,我当年一直用它。
"C++希尔排序是什么"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
排序
希尔
关键
序列
效率
测试
情况
时候
结果
C++
有序
个子
内容
整数
时间
更多
知识
过程
不错
复杂
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据库四种模式
广东省网络安全监察处
美团众包系统软件开发
数据库不能用于排序的字段类型是
海珠网络安全服务怎么选择
h81主板支持什么服务器cpu
唯品会提供的服务器
浙江web前端软件开发价位
网络安全两凡两禁三及时是什么
防疫信息数据库
正阳手机软件开发
ipad显示服务器丢了怎么处理
中学的网络安全如何规划
平顶山零基础学软件开发
数据库自动化管理平台
华为通用软件开发考什么语言
广州市天象网络技术有限公司
蓟州区节能软件开发服务价钱
腾讯现在有多少服务器
衢州mes软件开发
福建教师招聘网络技术
数据库原理慕课
绝地求生如何联系服务器
我们还应该注意网络安全
sas两个数据库匹配
甲骨文数据库的应用实例
农行上海总行软件开发
影视站服务器攻击
哪个不属于软件开发时期
广州贪吃虎网络技术有限公司扣钱