文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C++希尔排序是什么

2023-06-17 13:36

关注

本篇内容介绍了“C++希尔排序是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

希尔排序

前面的算法的平均效率都不怎么好,但我们注意到直插排序在关键码基本有序的情况下,效率是***的,并且,在关键码的数量很少的时候,n和n2的差距也不是那么的明显。基于以上的事实,D.L.Shell在1959年(老古董了)提出了缩小增量排序,基本思想是:取一个间隔(gap),将序列分成若干的子序列,对每个子序列进行直插排序;然后逐渐缩小间隔,重复以上过程,直到间隔为1。在开始的时候,每个子序列里关键码很少,直插的效率很高;随着间隔的缩小,子序列的关键码越来越多,但是在前面的排序基础上,关键码已经基本有序,直插的效率依然很高。

希尔排序的时间复杂度不好估量,gap的选取也没有定论,gap=[gap/2]的程序是***写的,至于为什么,写写就知道了。

template <class T>  void 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++希尔排序是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯