当前位置: 首页 > news >正文

初识数据结构:排序算法

◆博主名称:少司府

欢迎来到少司府的博客☆*: .。. o(≧▽≦)o .。.:*☆

数据结构系列个人专栏:

初阶数据结构_少司府的博客-CSDN博客

编程基础训练系列个人专栏:

编程基础50题_少司府的博客-CSDN博客

名不显时心不朽,再挑灯火看文章

目录

一、排序的概念及其运用

1.1 排序的相关概念

1.2 排序的相关运用

1.3 常见的几种排序算法

二、常见排序算法的实现(升序)

2.1 冒泡排序

2.2 选择排序

2.3 堆排序

2.3.1 向下调整函数

2.3.2 堆排序

2.4 插入排序

2.5 希尔排序

2.6 快速排序

2.6.1 hoare 版本

2.6.2 前后指针版

2.7 归并排序

2.8 计数排序

三、排序的总结

3.1 稳定性介绍

3.2 总结


一、排序的概念及其运用

1.1 排序的相关概念
排序所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增递减的排列起来的操作。
内部排序数据元素全部放在内存中的排序。
外部排序数据元素太多不能同时放在内存中,根据排序过程的要求不断地在内外存之间移动数据的排序。
1.2 排序的相关运用

排序算法在生活中无处不在,购物APP中商品的价格排行、国内各个高校的排名等等。

1.3 常见的几种排序算法

除此之外,我们列举了以下几种常见的排序算法。

其中,我们比较熟悉的就是冒泡排序了。

我们可以通过下面这个网站来查看各种排序的演示图:

https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html

二、常见排序算法的实现(升序)

2.1 冒泡排序

冒泡排序作为常见的排序算法,其核心不过是遍历两两交换,将大的数字冒到后面去,其时间复杂度是O(n^2),本身没有什么实践意义,但是具有教学意义,作为新生入门的排序刚刚好。

2.2 选择排序

和冒泡排序一样,直接选择排序也是时间复杂度为O(n^2)的排序算法,其本身也没有什么实践意义。

其核心是:遍历,找到最大元素的下标maxi,将它与最后一个元素交换(这样就把最大的排到了最后)。这里做了优化,同时走最大和最小,同时排出最大和最小,可以提升一点点效率。

2.3 堆排序
2.3.1 向下调整函数

堆排序的核心就是“建堆”和“排序”,因此,我们需要先写一个向下调整函数来实现建堆。

如图,while循环向下不断调整,若孩子比父亲大,则交换。

2.3.2 堆排序

堆排序的主要排序逻辑如图,先建大堆,取堆顶元素放到最后,在缩减范围之后,不断向下调整将大的数放到后面,完成升序的排序逻辑。

其具体逻辑在上期中讲过,可点击这里:https://blog.csdn.net/CAO_070413/article/details/158386332?fromshare=blogdetail&sharetype=blogdetail&sharerId=158386332&sharerefer=PC&sharesource=CAO_070413&sharefrom=from_link

堆排序的时间复杂度是O(N*logN)。

2.4 插入排序

在观看源码之前我们先简单介绍一下直接插入排序

直接插入排序是一种简单的排序算法,其主要逻辑是:默认前面是有序的数列,不断将后面的数插入到前面的数列之中

我们玩扑克牌的时候也是用的插入排序的逻辑。

如图,while循环之前定义一个end指向有序数列的最后一个数,tmp保存end后一个数,也就是待插入的数。

升序排序的话,如果tmp比end指向的数小,就不断把有序的数字往后推,当找到第一个小于等于tmp的数字时,就把tmp插到它的后面。

插入排序的时间复杂度是O(N^2)。

2.5 希尔排序

希尔排序的底层是插入排序,可以理解为对插入排序的拓展,由于是希尔这位大佬提出来的,所以叫做希尔排序(ShellSort)。

希尔排序的核心思想是:先对待排序数组进行预排序,使其变得相对有序,最后再进行直接插入排序。

虽然有预排序,看起来步骤多了,但实际上它的效率却是大大提高了。

如图,可以看到,希尔排序的底层仍然是插入排序,只是插入排序是一个一个地挪动,而希尔排序是先将数列分为多组每组内部进行插入排序(也就是预排序),以gap为单位进行挪动。

gap=gap/3+1一个是减少预排序的次数,另一个是让最后一次gap=1,这样最后一次就是直接插入排序了。

希尔排序的时间复杂度是O(N^1.3)。

2.6 快速排序
2.6.1 hoare 版本

我们在学C语言的时候应该有了解或者学习过qsort这个函数,这个函数的底层就是快速排序。

这里有个动图展示快速排序:https://gitee.com/bithange/113-issues/raw/master/24%E5%B9%B4-05%E6%9C%8827%E6%97%A5--%E6%8E%92%E5%BA%8F/%E5%8A%A8%E5%9B%BE/hoare.gif

如图,初识化key指向第一个数,L和R同时往两边走,R先走,R找到比key小的数字,L找到比key大的数字,并将这两个数交换,当L和R相遇的时候,其指向的数字是比key小的,将key和相遇位置交换,再对左右两边进行此操作(也就是递归)。

如图,该代码在原版本上加入了三数取中小区间优化

三数取中是找到left、right和mid的中间值下标,key指向中间值,如果数组已经有序,没有优化的化会让其退化为时间复杂度为O(N^2)的算法,递归深度增加导致栈溢出

小区间优化是让最后几层不递归,直接用其他的算法逻辑,这样能大大减少递归次数,提高效率。

2.6.2 前后指针版

由于hoare版本要考虑的细节比较多,且不容易理解,后来又对快速排序做了优化,前后指针版更容易理解一些。

这是前后指针的动图:

https://gitee.com/bithange/113-issues/raw/master/24%E5%B9%B4-05%E6%9C%8827%E6%97%A5--%E6%8E%92%E5%BA%8F/%E5%8A%A8%E5%9B%BE/%E5%89%8D%E5%90%8E%E6%8C%87%E9%92%88.gif

如图,初始化prev指向起始位置,cur指向后一个位置。cur向后面移动,当arr[cur] < arr[keyi]的时候,交换prev和cur指向的值,prev++cur++,不断将比arr[keyi]小的值放到左边,大的值放到右边。

如图,可以将单趟封装成一个子函数。

2.7 归并排序

归并排序采用分治的思想,其核心是将已经有序的数列合并,变成一个新的有序的数列。

如图,类似于二叉树的结构,我们把数列不断分为两组,若只有一个数,则认为已经有序了。

如图,归并排序也是需要封装一个子函数来处理排序逻辑。

与其他排序不同的是,归并排序需要额外开一个空间复杂度为O(N)的空间,begin1、end1,begin2、end2分别指向两组数列的首尾,不断递归使其有序

把排好序的数列不断追加到tmp数列中。

最后再用memcpy把tmp拷贝到原数组去。

归并排序时间复杂度是O(N*logN),空间复杂度是O(N)。

2.8 计数排序

与上述排序都不一样的是,计数排序是一种非比较排序。其核心思想:统计相同元素出现次数,并根据统计的结果将序列回收到原来的序列中

如图,先找到最大值和最小值相差的范围,再开辟一个count的空间用于统计次数,最后通过数字出现的次数来对原数组进行排序。

其算法的时间复杂度是O(N+range),空间复杂度是O(N)

三、排序的总结

3.1 稳定性介绍

稳定性概念:相等的值在排序后其相对位置保持不变,则稳定性强。

3.2 总结
时间复杂度空间复杂度稳定性
直接插入排序O(N^2)O(1)
希尔排序O(N^1.3)O(1)
选择排序O(N^2)O(1)
堆排序O(N*logN)O(1)
冒泡排序O(N^2)O(1)
快速排序O(N*logN)O(logN)
归并排序O(N*logN)O(N)

本期的分享就到这里,如果觉得博主的文章比较对胃口的话,可以点一个小小的关注~

您的三连是我持续更新的动力~

http://www.jsqmd.com/news/496770/

相关文章:

  • 网络安全学习4
  • 2026被动防护网选型指南:五大厂商技术路线与市场格局深度解析 - 2026年企业推荐榜
  • 文件系统红蓝对抗:从ext4到ZFS的数据持久性战争
  • VirtualLab:Ince高斯模式
  • JetBrains IDEs官宣 实验性 AI 功能:Recap 与 Insights 详解
  • 网络协议红蓝对抗:从TCP重传到QUIC的可靠性战争
  • springboot+vue社区疫情返乡管控系统--毕业论文
  • 宝塔面板下Laravel开发环境的高效配置与调试技巧
  • SpringBoot3接口优化:一行注解搞定字典与关联字段翻译,告别冗余循环
  • 【小程序】✈️一口气用AI肝了50+功能的小程序(已上线)
  • 一次线上事故,我学到了事件驱动架构的5个教训
  • TechWiz LCD 2D应用:单畴IPS仿真
  • leetcode 1409. 查询带键的排列
  • 43| 贴海报
  • 打不开游戏提示缺少D3DCompiler_47.dll文件 分享免费下载
  • 光活化标记试剂 Photobiotin acetate salt,96087-38-6
  • 2026年国内焦磷酸二氢二钠优质直销厂家实力与特点盘点 - 深度智识库
  • 2026年深圳人力资源咨询公司哪家强?靠谱可信赖 覆盖多行业需求 可落地参考 - 深度智识库
  • 国企是否有必要自建即时通讯系统,而不是采购成品?
  • [特殊字符] OpenClaw(小龙虾)CentOS 7 完整安装手册
  • 老码农和你一起学AI系列:语言模型采样方法
  • 成都劳动合同纠纷优质律所推荐指南:成都施工合同纠纷律师事务所/成都物业合同纠纷律师事务所/选择指南 - 优质品牌商家
  • 计院操作系统实验10
  • AI一键图片转3D模型工具TrOSR|离线运行·6G显存即可·附详细图文教程
  • 【靶点筛选样本前处理①】细胞膜蛋白的全流程提取实操:标准化制备及验证
  • 使用NPOI包的时候,报错NPOI.OpenXmlFormats.dll不存在
  • 【程序员转行】大厂狂加码AI,零基础程序员/小白必看,这个风口岗位年薪可达36W
  • 从0实现OnCall基于Python语言框架
  • 2026年全国精密传动设备选型:卓创精锐如何以行星、伺服减速机、换向器破解自动化厂家精度困局 - 深度智识库
  • HCIP-AI-EI Developer V2.5 第四章笔记