归纳总结

2027 · OCR 辅助 · 原书检索 · 文字用于定位,公式与图表请回原页核验 · 本次导入快照

## 归纳总结

下面对本章所介绍的排序算法进行一次系统的比较与复习。

1. 基本排序算法:适用于元素个数 $n$ 不是很大($n < 10000$)的情形。

直接插入排序、冒泡排序和简单选择排序均属于此类,平均时间复杂度均为 $O(n^{2})$,实现简单。直接插入排序在小规模数据($n \leqslant 25$)时效率较高;在最好情况下,仅需 $n - 1$ 次比较。冒泡排序在最好情况下只需 1 趟扫描和 $n - 1$ 次比较。简单选择排序的比较次数恒为 $O(n^{2})$,与初始排列无关,但移动次数受初始状态影响,最多不超过 $3(n - 1)$ 次。这三类算法的空间复杂度均为 $O(1)$,仅需一个辅助变量。其中,直接插入排序和冒泡排序是稳定的,而简单选择排序不稳定。

2. 对于中等规模数据($n \leqslant 1000$),希尔排序是一种很好的选择。

它通过逐步缩小增量对子序列进行插入排序,初期移动距离大,后期接近有序,从而显著减

<!-- page: 403 -->

第8章 排序
391

少总的比较与移动次数。希尔排序代码简洁,空间开销小(开销为 $O(1)$),但属于不稳定排序。

3. 大规模高效排序算法:当 $n$ 很大时,应选用时间复杂度为 $O(n \log_2 n)$ 的算法。

快速排序是最通用的高效内部排序方法,平均时间复杂度为 $O(n \log_2 n)$,平均空间复杂度为 $O(\log_2 n)$,虽然在最坏情况下(如输入已有序)退化为 $O(n^2)$,但可通过“三者取中”等策略有效规避。堆排序的时间复杂度稳定为 $O(n \log_2 n)$,无性能退化问题,且仅需 $O(1)$ 的额外空间,但平均性能通常略逊于快速排序。归并排序的时间复杂度始终为 $O(n \log_2 n)$,与输入无关,稳定性好,但需要 $O(n)$ 的额外存储空间。基数排序具有线性时间复杂度 $O(d(n + r))$,但其实际效率受限于关键字结构和平台支持,通用性较弱,应用不如比较类排序广泛。

4. 混合策略:

实际系统常结合多种算法以扬长避短。例如,在归并排序或快速排序的递归底层切换为直接插入排序,可减少函数调用开销并提升局部效率。

综上,排序算法的选择应综合考虑数据规模、内存限制、稳定性要求及输入特性。深入理解各类算法的优劣,有助于在实际应用中做出更合理、高效的决策。

思维拓展

一道看似吓人的题目:对 $n$ 个整数进行排序,要求时间复杂度为 $O(n)$,空间复杂度为 $O(1)$。

提示

设待排序整数的范围为 $0 - 65535$,设定一个数组int count[65535]并初始化为0,则所需空间与 $n$ 无关,为 $O(1)$。扫描一遍待排序列X[],count[X[i]]++,时间复杂度为 $O(n)$;再扫描一次count[],当count[i]&gt;0时,输出count[i]个i,排序完毕所需的时间复杂度也为 $O(n)$;所以总时间复杂度为 $O(n)$,空间复杂度为 $O(1)$。另外,读者可能会问假如有负整数怎么办,这种情况下可以给所有整数都加上一个偏移量,使之都变成正整数,再使用上述方法。

购买王道书,就上
王道官方考研书店
wangdao.taobao.com

原转写引用的配图未随 Markdown 保存,请回到原 PDF 核验。


<!-- page: 404 -->

# 参考文献

[1] 严蔚敏,吴伟民.数据结构(C语言版)[M].北京:清华大学出版社,2018.
[2] 科尔曼,雷瑟尔森,李维斯特,等.算法导论[M].3版.股建平,徐云,刘晓光,等译.北京:机械工业出版社,2013.
[3] 李春葆,陈良臣,尹为民,等.数据结构教程(C++语言描述)[M].北京:清华大学出版社,2009.
[4] 陈守孔,胡潇琨,李玲.算法与数据结构考研试题精析[M].北京:机械工业出版社,2007.
[5] 夏清国.数据结构考研教案[M].西安:西北工业大学出版社,2006.
[6] 全国考研计算机大纲配套教材专家委员会.全国硕士研究生入学统一考试计算机专业基础综合考试大纲解析[M].北京:高等教育出版社,2023.
[7] 李春葆,尹为民,陈良臣.数据结构联考辅导教程[M].北京:清华大学出版社,2010.