news 2026/6/4 10:55:37

排序--直接排序,希尔排序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
排序--直接排序,希尔排序

插入排序

2.1.1 基本思想

直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列

实际中我们玩扑克牌时,就用了插入排序的思想——每摸一张新牌,就将其插入到手中已有序的牌中的合适位置。

2.1.2 直接插入排序

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

直接插入排序的特性总结:

  1. 元素集合越接近有序,直接插入排序算法的时间效率越高
  2. 时间复杂度
    • 最好情况(已有序):O(N)
    • 平均/最坏情况:O(N²)
  3. 空间复杂度:O(1),它是一种原地排序算法;
  4. 稳定性稳定(相等元素的相对位置不会改变)。
voidDirectSorting(int*arr,intn){for(inti=0;i<n-1;i++){intend=i;intcur=arr[end+1];while(end>=0){if(cur<arr[end]){arr[end+1]=arr[end];end--;}elsebreak;}arr[end+1]=cur;}}

直接排序与冒泡排序形式上有些相似,但本质区别很大,冒泡排序是对相邻的两个数轮流比较,将最大的数经过n-1轮后冒泡到最后一个,此后每轮冒泡次数减一,而直接排序是将从有序数列开始(对于无序数列来说,有序数列是0),将后面的无序数依次与前面的有序数比较,将其放在合适的位置


2.1.3 希尔排序(缩小增量排序)

希尔排序(Shell Sort)又称缩小增量排序,是对直接插入排序的一种高效改进算法。其基本思想是:

先选定一个小于数组长度的整数作为初始增量(gap),将待排序序列中所有间隔为gap的元素划分为若干个子序列,每个子序列分别进行直接插入排序;随后逐步缩小增量(如gap = gap / 2gap = gap / 3 + 1),重复分组和排序过程;当增量减至 1 时,整个序列被当作一个子序列进行最后一次直接插入排序,此时序列已基本有序,排序效率很高。

关键说明:

预排序

  • 分组方式:不是按连续块分组,而是按“下标模gap相同”来分组。
    例如,当gap = 3时,子序列为:
    • 第0组:arr[0], arr[3], arr[6], ...
    • 第1组:arr[1], arr[4], arr[7], ...
    • 第2组:arr[2], arr[5], arr[8], ...
  • 每轮排序:对每个子序列独立执行直接插入排序使得在数列进行完全的直接插入排序时,数列趋于有序,可以大大提升直接插入排序的效率
  • Knuth 序列:对于gap,我们应该灵活分组,对数列进行多次分组预排序列,目前认为Knuth 序列是其中比较高效的分组方法之一,hk=(3^k-1)/2,k∈z+,即当gap=1, 4, 13, 40, 121, 364, 1093, 3280, …时,符合Knuth序列,但是我们在实际过程中,为了方便,通常用gap=n/3+1来代替Knuth序列,简洁的同时+1保证最后gap一定会回到1完成最后的完全直接排序,且效率与Knuth序列相近
希尔排序的特点:
项目说明
时间复杂度依赖增量序列,通常为 O(n^1.3) ,优于直接插入排序
空间复杂度O(1) (原地排序)
稳定性不稳定(跨组交换可能改变相等元素的相对顺序)
适用场景中等规模数据(几千到几万),或作为快速排序的优化子过程
为什么有效?
  • 初始大增量使元素快速移动到大致正确的位置(“粗调”);
  • 后续小增量对已基本有序的序列做精细调整(“微调”);
  • 最后gap = 1时,直接插入排序的效率接近 O(n) 。

核心优势:通过多轮“局部有序”,显著减少最终插入排序的移动次数。

voidShellSorting(int*arr,intn){for(intgap=n/3+1;gap>=1;gap/=3)for(inti=0;i<n-gap;i++)//合并写法,虽然将数组分为了n/gap个组,每个组都有gap个数,但不一定需要三层循环,可以从下标零开始,对每一个数开始顺序调正,但他们依旧是与自己gap组的数比较{intend=i;intcur=arr[end+gap];while(end>=0){if(cur<arr[end]){arr[end+gap]=arr[end];end=end-gap;}elsebreak;}arr[end+gap]=cur;}}

使用实现Kunth序列分组:

voidKnuthShellSorting(int*arr,intn){intgap=1;while(gap<n/3){// 注意:这里用 n/3 避免 gap >= n,(n/3-1)*3=n-3gap=gap*3+1;}//到此处完成knuth序列。while(gap>=1){for(inti=0;i<n-gap;i++){intend=i;intcur=arr[end+gap];while(end>=0&&cur<arr[end]){arr[end+gap]=arr[end];end-=gap;}arr[end+gap]=cur;}gap=(gap-1)/3;遍历Knuth序列}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/28 20:45:52

3分钟解决Windows热键冲突:Hotkey Detective高效排查指南

3分钟解决Windows热键冲突&#xff1a;Hotkey Detective高效排查指南 【免费下载链接】hotkey-detective A small program for investigating stolen hotkeys under Windows 8 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 副标题&#xff1a;告别快捷…

作者头像 李华
网站建设 2026/5/30 13:57:28

还在为外语网页抓狂?这款黑科技插件让外文秒变母语

还在为外语网页抓狂&#xff1f;这款黑科技插件让外文秒变母语 【免费下载链接】deepl-chrome-extension A DeepL Translator Chrome extension 项目地址: https://gitcode.com/gh_mirrors/de/deepl-chrome-extension 刷到干货满满的外文论文却卡在专业术语&#xff1f;…

作者头像 李华
网站建设 2026/5/28 13:52:22

批量处理失败怎么办?科哥UNet常见问题全解答

批量处理失败怎么办&#xff1f;科哥UNet常见问题全解答 你是不是也遇到过这样的情况&#xff1a;满怀期待地把几十张商品图拖进批量处理页面&#xff0c;点击“ 批量处理”后&#xff0c;进度条卡在30%不动了&#xff1f;或者等了半天&#xff0c;只生成了一个空zip包&#xf…

作者头像 李华
网站建设 2026/5/30 17:53:18

全网热议!2026年视频二维码生成器推荐榜单,帮你提升信息分享效率

在2026年的视频二维码生成器推荐中&#xff0c;我们将对多款受欢迎的工具进行深入分析。这些工具能够快速将视频内容转换为二维码&#xff0c;方便用户在各种场合分享信息。每款生成器都有其独特的功能&#xff0c;满足不同需求。例如&#xff0c;有的支持多种信息格式&#xf…

作者头像 李华
网站建设 2026/5/30 17:53:32

Z-Image-Turbo_UI界面助力创意设计高效落地

Z-Image-Turbo_UI界面助力创意设计高效落地 1. 开箱即用&#xff1a;无需安装&#xff0c;浏览器里直接开干 你有没有过这样的经历&#xff1a;刚下载好一个图像生成工具&#xff0c;结果卡在环境配置上——装Python、配CUDA、解决依赖冲突……折腾两小时&#xff0c;一张图还…

作者头像 李华