数据结构篇_知识点板块_第八章内部排序
数据结构篇为本人考研时所写笔记,包括知识点和编程思想两大板块,笔记内容依据王道数据结构考研书所写,但比书本上知识更加生动形象,愿本篇章能对您有所帮助
八、内部排序
(一)排序基本概念
-
考试常考:看到某特定序列选择最优算法(一般用排除法写,且一般进行极端情况的对比,只要优于就选)
-
堆排序题目问数组状态时答是画图
-
名词概念:
① 文件:由一组记录组成,记录有若干数据项组成
② 关键字:唯一标识记录的数据项
- 稳定性:
① 经过排序后,能使关键字形态的元素保持原顺序中的相对位置不变
② 不稳定性:反之
③ 注意:算法是否具有稳定性并不能衡量一个算法的优劣,它主要是对算法的性质描述
④ 答题时说明不稳定性只需举出一组关键字序列即可
⑤ 两个稳定的算法一起用程序还是稳定的
- 排序分类:
① 内部排序:数据元素是否完全在内存中(一般要算法执行过程中都进行比较和移动操作,但比如基数排序就不基于比较)
② 外部排序:反之
-
内部排序算法性能取绝与算法的时间复杂度(时间性能,时间效率)和空间复杂度(空间性能,空间效率)
-
对同一线性表使用不同的排序算法排序,得到的排序结果可能不同
-
对任意n个关键字排序的次数至少为向上取整(log_2(n!))
-
进行基数排序时记得从个位数开始比,不要习惯性的比较数字的第一个数字
-
筛选法建堆,它可以在线性时间复杂度下完成建堆。以最大堆为例介绍具体操作过程:
① 首先将N个数据元素存入一个一维数组,并把这个数组视作一棵完全二叉树。
② 从二叉树的最后一个非叶结点(数组n/2开始)开始用从上向下过滤的方法调整以该非叶结点为根节点的二叉树为最大堆。
③ 对前面的结点依次执行2)的操作直到根结点执行完成为止。此时这棵二叉树就调整为了一个最大堆
④ 构建堆是边插边排
⑤ 建堆时比较次数不超过4n次
- 从小根堆调整到大根堆是从最下面最右边的一棵子树开始调整,反之亦然
(二)各排序算法的比较
- 一般基于三个因素进行比较:
① 时空复杂度
② 算法稳定性
③ 算法的过程特征(算法的复杂程度)
1)效率比较
- 归并排序可视为本章算法中占用辅助空间最多的排序算法
2)应用比较
- 选取排序方法需要考虑的因素:
① 待排序的元素数目n
② 元素本身信息量的大小
③ 关键字的结构及其分布情况
④ 稳定性的要求
⑤ 语言工具的条件
⑥ 存储结构
⑦ 辅助空间的大小
- 应用比较:
① 若n较小(<1000),可采用直接插入排序或简单选择排序或冒泡。由于直接插入排序所需的记录移动次数较简单选择排序的多,因而当记录本身信息量较大时,用简单选择排序较好
(1) 通常情况下,直接插入排序每趟插入都需要依次向后挪位,而简单选择排序只需与找到的最小位置交换位置,后者移动次数少很多
② 若文件的初始状态已按关键字基本有序,则选用直接插入或冒泡排序为宜
③ 若n中等大小(<=1000),希尔排序是很好的选择
④ 若n较大(>1000),则应采用时间复杂度为O(nlog_2(n))的排序方法:快速排序、堆排序,归并排序
(1) 若要求排序稳定且时间复杂度为O(nlog_2(n)),则可选用归并排序。但本章介绍的从单个记录起进行两两归并的排序算法并不值得提倡,通常可以将它和直接插入排序结合在一起使用。先利用直接插入排序求得较长的有序子文件,然后两两归并
(2) 若n很大,记录的关键字位数较少且可以分解时,采用基数排序较好(只适用于有明显结构特征的关键字,且基数排序不能对float等类型实数进行排序,故若题目要求关键字为实数则不能选择基数排序)
⑤ 在基于比较的排序方法中,每次比较两个关键字的大小之后,仅出现两种可能的转移因此可以用一棵二叉树来描述比较判定过程,由此可以证明:当文件的n个关键字随机分布时,任何借助于“比较”的排序算法,至少需要O(nlogn)的时间
⑥ 当记录本身信息量较大时,为避免耗费大量时间移动记录,可用链表作为存储结构,如插入、归并、基数排序,但快排和堆排序在链表上难实现,可提取关键字建立索引表后对索引表排序
⑦ 有的语言没有提供指针及递归,这时归并、快速、基数排序算法复杂
⑧ 只需得到前k小元素的顺序排列可采用的排序算法有冒泡排序,堆排序和简单选择排序
- 混合使用不同排序算法是一种普遍的算法改进方法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现