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

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

相关推荐
爱敲代码的TOM1 小时前
数据结构总结
数据结构
CoderCodingNo1 小时前
【GESP】C++五级练习题 luogu-P1865 A % B Problem
开发语言·c++·算法
大闲在人1 小时前
7. 供应链与制造过程术语:“周期时间”
算法·供应链管理·智能制造·工业工程
小熳芋1 小时前
443. 压缩字符串-python-双指针
算法
Charlie_lll1 小时前
力扣解题-移动零
后端·算法·leetcode
chaser&upper1 小时前
矩阵革命:在 AtomGit 解码 CANN ops-nn 如何构建 AIGC 的“线性基石”
程序人生·算法
weixin_499771551 小时前
C++中的组合模式
开发语言·c++·算法
iAkuya2 小时前
(leetcode)力扣100 62N皇后问题 (普通回溯(使用set存储),位运算回溯)
算法·leetcode·职场和发展
近津薪荼2 小时前
dfs专题5——(二叉搜索树中第 K 小的元素)
c++·学习·算法·深度优先
xiaoye-duck2 小时前
吃透 C++ STL list:从基础使用到特性对比,解锁链表容器高效用法
c++·算法·stl