题解:洛谷 P5715 三位数排序
【题目来源】
【题目描述】
给出三个整数 \(a,b,c(0\le a,b,c\le 100)\),要求把这三位整数从小到大排序。
【输入】
输入三个整数 \(a,b,c\),以空格隔开。
【输出】
输出一行,三个整数,表示从小到大排序后的结果。
【输入样例】
1 14 5
【输出样例】
1 5 14
【核心思想】
-
问题分析:给定三个整数 \(a, b, c\),要求将它们从小到大排序后输出。这是一个基础的三元素排序问题。
-
算法选择:
- 冒泡排序思想:通过三次比较和交换,将三个数按升序排列
- swap函数:利用标准库swap直接交换两个变量的值
-
关键步骤:
- 读入数据:
cin >> a >> b >> c - 三次比较交换:
- 若
a > b:swap(a, b),保证 \(a \le b\) - 若
b > c:swap(b, c),保证 \(b \le c\)(此时 \(c\) 为最大值) - 若
a > b:swap(a, b),再次保证 \(a \le b\)(因第二步可能改变 \(a, b\) 的相对顺序)
- 若
- 输出结果:
printf("%d %d %d", a, b, c)
- 读入数据:
-
时间/空间复杂度:
- 时间复杂度:\(O(1)\),固定三次比较交换
- 空间复杂度:\(O(1)\),原地交换无需额外空间
-
三元素排序的核心思想:
- 冒泡排序的简化:对三个元素,冒泡排序最多需要3次比较即可完成
- 交换而非赋值:使用swap直接交换值,避免引入额外变量存储中间结果
- 顺序保证:通过"前两次确定最大值沉底,第三次修复可能的前逆序"完成全局有序
- 适用于小数据量排序、基础交换操作、排序思想入门类问题
【算法标签】
入门 #模拟
【代码详解】
#include <bits/stdc++.h> // 包含标准库头文件(万能头文件)
using namespace std; // 使用标准命名空间
/**
* 主函数 - 程序入口
* @return 程序执行状态码(0表示成功)
*/
int main()
{
int a, b, c; // 定义三个待排序的整数
cin >> a >> b >> c; // 输入三个整数
// 方法一(注释掉的原始方案):多重条件判断排序
// if (a<=b && a<=c) {
// a1 = a;
// b1 = b;
// c1 = c;
// } else if (b<=a && b<=c) {
// a1 = b;
// b1 = a;
// c1 = c;
// } else {
// a1 = c;
// b1 = a;
// c1 = b;
// }
// if (b1<=c1) {
// cout << a1 << " " << b1 << " " << c1;
// } else {
// cout << a1 << " " << c1 << " " << b1;
// }
// 方法二(实际采用的方案):使用swap函数进行冒泡排序
if (a > b)
{
swap(a, b); // 保证a <= b
}
if (b > c)
{
swap(b, c); // 保证b <= c(此时c是最大值)
}
if (a > b)
{
swap(a, b); // 再次保证a <= b
}
// 输出排序结果(使用printf保证格式统一)
printf("%d %d %d", a, b, c);
return 0; // 程序正常结束
}
【运行结果】
1 14 5
1 5 14
浙公网安备 33010602011771号