408真题解析-2010-11-数据结构-基础排序算法特征

一 真题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题 快速排序

说明 :本文内容基于公开资料整理,参考了包括但不限于《数据结构》(严蔚敏)、《计算机操作系统》(汤小丹)、《计算机网络》(谢希仁)、《计算机组成原理》(唐朔飞)等国内高校经典教材,以及其他国际权威著作。同时,借鉴了王道、天勤、启航等机构出版的计算机专业考研辅导系列丛书 中的知识体系框架与典型题型分析思路。文中所有观点、例题解析及文字表述均为作者结合自身理解进行的归纳与重述,未直接复制任何出版物原文。内容仅用于学习交流,若有引用不当或疏漏之处,敬请指正。

相关推荐
sali-tec2 小时前
C# 基于OpenCv的视觉工作流-章14-轮廓提取
人工智能·opencv·算法·计算机视觉
东华果汁哥2 小时前
【机器视觉 视频截帧算法】OpenCV 视频截帧算法教程
opencv·算法·音视频
我家大宝最可爱4 小时前
强化学习基础-拒绝采样
人工智能·算法·机器学习
YuTaoShao5 小时前
【LeetCode 每日一题】面试题 17.12. BiNode
算法·leetcode·深度优先
刘大猫.5 小时前
XNMS项目-拓扑图展示
java·人工智能·算法·拓扑·拓扑图·节点树·xnms
万象.5 小时前
redis数据结构set和zset的基本指令
数据结构·数据库·redis
夏鹏今天学习了吗7 小时前
【LeetCode热题100(95/100)】寻找重复数
算法·leetcode·职场和发展
TTGGGFF10 小时前
控制系统建模仿真(四):线性控制系统的数学模型
人工智能·算法
晚风吹长发10 小时前
初步了解Linux中的命名管道及简单应用和简单日志
linux·运维·服务器·开发语言·数据结构·c++·算法