一 真题2010-11
2010-11. 对一组数据 (2,12,16,88,5,10)进行排序,若前三趟排序结果如下:
- 第一趟排序结果: 2 , 12 , 16 , 5 , 10 , 88 2,12,16,5,10,88 2,12,16,5,10,88
- 第二趟排序结果: 2 , 12 , 5 , 10 , 16 , 88 2,12,5,10,16,88 2,12,5,10,16,88
- 第三趟排序结果: 2 , 5 , 10 , 12 , 16 , 88 2,5,10,12,16,88 2,5,10,12,16,88
则采用的排序方法可能是( )。
A. 冒泡排序
B. 希尔排序
C. 归并排序
D. 基数排序
二 题目要素解析
题目特征:给出排序过程中的中间结果(前三趟),反推使用的排序算法。
核心考点:
- 冒泡排序 :每一趟将最大的元素 "冒泡" 到末尾(或者最小的到开头),有序区在末尾且长度逐渐增加。
- 希尔排序 :按增量分组进行插入排序,每一趟后局部有序,但整体无序,且不一定有元素固定在最终位置。
- 归并排序 :每一趟将相邻的有序子序列合并,有序区长度呈倍数增长(1→2→4→8...)。
- 基数排序:按位(个位、十位...)分配和收集,每一趟后低位有序。
三 哔哔详解
Step 1:逐算法排除法
🔹 A. 冒泡排序(Bubble Sort)
- 特点 :每趟从左到右比较相邻元素,最大值"冒泡"至末尾
- 第1趟:最大值 88 应移至最后
- 初始:
[2,12,16,88,5,10] - 比较过程:
88 > 5→ 交换 →[2,12,16,5,88,10]88 > 10→ 交换 →[2,12,16,5,10,88]
- ✅ 完全匹配第一趟结果!
- 初始:
- 第2趟:次大值 16 应移至倒数第二位
- 当前:
[2,12,16,5,10,88](88已固定) - 比较前5个:
12 < 16→ 不换16 > 5→ 交换 →[2,12,5,16,10,88]16 > 10→ 交换 →[2,12,5,10,16,88]
- ✅ 完全匹配第二趟结果!
- 当前:
- 第3趟:12应移至倒数第三位
- 当前:
[2,12,5,10,16,88](后两位固定) - 比较前4个:
2 < 12→ 不换12 > 5→ 交换 →[2,5,12,10,16,88]12 > 10→ 交换 →[2,5,10,12,16,88]
- ✅ 完全匹配第三趟结果!
- 当前:
🎯 结论:冒泡排序完美符合所有三趟结果!
🔹 B. 希尔排序(Shell Sort)
- 特点:按步长分组进行插入排序,步长递减(如 d=⌊n/2⌋,⌊d/2⌋,... )
- 初始 n=6,通常取 d1=3 , d2=1
- 第1趟(d=3):
- 分组:
(2,88),(12,5),(16,10) - 插入排序后:
[2,5,10,88,12,16]或类似 - ❌ 无法得到
[2,12,16,5,10,88]
- 分组:
- 即使尝试其他步长序列,也无法解释
88直接跳到末尾的行为
❌ 排除
🔹 C. 归并排序(Merge Sort)
- 特点 :自底向上或自顶向下分治,先分解再合并
- 第1趟(自底向上):两两归并 → [2,12], [16,88], [5,10]
- 结果应为:
[2,12,16,88,5,10](未改变顺序)
- 结果应为:
- 第2趟 :四四归并 →
[2,12,16,88], [5,10] - 第3趟:整体归并 → 有序
- ❌ 从未出现
88提前移到末尾的情况
❌ 排除
🔹 D. 基数排序(Radix Sort)
- 特点:按位(个位、十位...)分配桶,稳定排序
- 第1趟(个位):
- 个位数字:
2→2, 12→2, 16→6, 88→8, 5→5, 10→0 - 按个位排序:
10, 2, 12, 5, 16, 88 - 结果:
[10,2,12,5,16,88]
- 个位数字:
- ❌ 与题目第一趟
[2,12,16,5,10,88]完全不符
❌ 排除
四 参考答案
A ✅
五 考点精析
5.1 基础排序算法概念速览
1. 插入类排序
- 直接插入排序 (Insertion Sort):
- 思想:将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增 1 的有序表。
- 特点:简单直观,稳定。
- 希尔排序 (Shell Sort):
- 思想:先将整个待排序列分割成若干子序列分别进行直接插入排序,待整个序列中的记录 "基本有序" 时,再对全体记录进行一次直接插入排序。
- 特点:插入排序的改进版,不稳定。
2. 交换类排序
- 冒泡排序 (Bubble Sort):
- 思想:相邻元素两两比较,逆序则交换,每一趟将最大的元素 "冒泡" 到末尾。
- 特点:稳定,简单。
- 快速排序 (Quick Sort):
- 思想:分治法。选取枢轴,将数组划分为两部分,左边小于枢轴,右边大于枢轴,递归排序。
- 特点:交换排序的改进版,不稳定,平均效率最高。
3. 选择类排序
- 简单选择排序 (Selection Sort):
- 思想:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后。
- 特点:不稳定(例如 5, 3, 5, 2)。
- 堆排序 (Heap Sort):
- 思想:利用堆这种数据结构所设计的排序算法。将数组构建成大顶堆,每次取出堆顶元素(最大值),与堆尾交换,然后调整堆。
- 特点:选择排序的改进版,不稳定。
4. 归并类排序
- 2 - 路归并排序 (Merge Sort):
- 思想:将两个或两个以上的有序表合并成一个新的有序表。
- 特点:稳定,分治法的典型应用。
5. 分配类排序
- 基数排序 (Radix Sort):
- 思想:基于关键字各位的大小进行排序(如个位、十位)。
- 特点:不基于比较,稳定。
5.2 基础排序算法 比较
| 算法 | 基本思想 | 时间复杂度(平均/最坏) | 空间复杂度 | 稳定性 | 原地排序 |
|---|---|---|---|---|---|
| 插入排序 | 将元素逐个插入到已序序列中 | O(n\^2) / O(n\^2) | O(1) | ✅ | ✅ |
| 冒泡排序 | 相邻比较,大者"冒泡"至末尾 | O(n\^2) / O(n\^2) | O(1) | ✅ | ✅ |
| 选择排序 | 每趟选出最小值放到前面 | O(n\^2) / O(n\^2) | O(1) | ❌ | ✅ |
| 希尔排序 | 分组插入排序,步长递减 | O(n\^{1.3}) / O(n\^2) | O(1) | ❌ | ✅ |
| 快速排序 | 分治 + 划分(pivot 归位) | O(n \\log n) / O(n\^2) | O(\\log n) | ❌ | ✅ |
| 归并排序 | 分治 + 合并两个有序子数组 | O(n \\log n) / O(n \\log n) | O(n) | ✅ | ❌ |
| 堆排序 | 建大顶堆,依次取堆顶放末尾 | O(n \\log n) / O(n \\log n) | O(1) | ❌ | ✅ |
| 基数排序 | 按位(个、十...)分配桶(LSD) | O(d(n+k)) | O(n+k) | ✅ | ❌ |
✅ 注:
- 稳定性:相等元素相对位置是否保持不变
- 原地排序:仅使用 O(1)O(1) 额外空间(不计递归栈)
- d : 位数,k: 基数(如十进制 k=10)
六 考点跟踪
| 年份 | 题号 | 考查内容 | CSDN 参考链接 | VX参考链接 |
|---|---|---|---|---|
| 2010 | 第11题 | 冒泡排序 | ||
| 2018 | 第10题 | 希尔排序 | ||
| 2023 | 第11题 | 快速排序 |
说明 :本文内容基于公开资料整理,参考了包括但不限于《数据结构》(严蔚敏)、《计算机操作系统》(汤小丹)、《计算机网络》(谢希仁)、《计算机组成原理》(唐朔飞)等国内高校经典教材,以及其他国际权威著作。同时,借鉴了王道、天勤、启航等机构出版的计算机专业考研辅导系列丛书 中的知识体系框架与典型题型分析思路。文中所有观点、例题解析及文字表述均为作者结合自身理解进行的归纳与重述,未直接复制任何出版物原文。内容仅用于学习交流,若有引用不当或疏漏之处,敬请指正。