难度:进阶。题目原型为 AOJ ALDS1_2_C Stable Sort。本题考察排序的稳定性:冒泡排序稳定,选择排序不稳定,并把两者对同一输入的排序结果并列输出。
目标
完成本题后,你应该能够:
- 解释「稳定排序」的含义:关键字相同的元素,排序后相对顺序不变;
- 用结构体表示「花色 + 数字」的牌,并按数字这一关键字排序;
- 对比冒泡排序与选择排序的输出,判断选择排序在给定输入下是否稳定。
前置知识
- 10.2 选择排序、10.3 冒泡排序的实现;
- 结构体、字符与整数。
题目
读入 n 和 n 张牌,每张牌由一个花色(S、H、C、D 之一)和一个数字(1..9)组成。分别用冒泡排序和选择排序按数字从小到大排序,并输出:
- 冒泡排序的结果(一行),下一行输出
Stable; - 选择排序的结果(一行),下一行输出
Stable或Not stable(取决于该输入下选择排序是否稳定)。
输入格式
- 第一行一个整数
n; - 第二行
n个「花色 + 数字」的牌,空格分隔,例如H4 C9 S4 D2 C3。
输出格式
共 4 行:
- 第 1 行:冒泡排序结果(空格分隔);
- 第 2 行:
Stable; - 第 3 行:选择排序结果(空格分隔);
- 第 4 行:
Stable或Not stable。
数据范围
| 项目 | 范围 |
|---|---|
牌数 n | 1 ≤ n ≤ 36 |
| 花色 | S / H / C / D |
| 数字 | 1..9 |
样例
样例输入
input
5
H4 C9 S4 D2 C3样例输出
output
D2 C3 H4 S4 C9
Stable
D2 C3 S4 H4 C9
Not stable样例解释
两张数字为 4 的牌 H4、S4 原本顺序是 H4 在前。冒泡排序保持了这个顺序(H4 S4),所以稳定;选择排序把它们交换成了 S4 H4,所以不稳定。
如何验证
先安装 Node.js、pnpm 和支持 C++17 的编译器。
powershell
# 已进入本 Lab 目录
make doctor
make run
make run CASE=001-sample
make interactive
make scoreWindows 没有安装 Make 时,在仓库根目录使用等价的 pnpm 入口:
powershell
pnpm lab:run -- labs/chapter-10/exercise/E-10-08-stable-sort-check
pnpm lab:score -- labs/chapter-10/exercise/E-10-08-stable-sort-check标准输出参与判题,调试信息请写入标准错误。
完成清单
思考题
- 选择排序在什么情况下是稳定的?能不能举出一个「含相同数字但选择排序仍然稳定」的例子?
- 如果判断稳定性的方法改成「比较选择排序与冒泡排序结果是否一致」,为什么是可行的?