题解:洛谷 P5715 三位数排序

【题目来源】

洛谷:P5715 【深基3.例8】三位数排序 - 洛谷

【题目描述】

给出三个整数 \(a,b,c(0\le a,b,c\le 100)\),要求把这三位整数从小到大排序。

【输入】

输入三个整数 \(a,b,c\),以空格隔开。

【输出】

输出一行,三个整数,表示从小到大排序后的结果。

【输入样例】

1 14 5

【输出样例】

1 5 14

【核心思想】

  1. 问题分析:给定三个整数 \(a, b, c\),要求将它们从小到大排序后输出。这是一个基础的三元素排序问题。

  2. 算法选择

    • 冒泡排序思想:通过三次比较和交换,将三个数按升序排列
    • swap函数:利用标准库swap直接交换两个变量的值
  3. 关键步骤

    • 读入数据cin >> a >> b >> c
    • 三次比较交换
      • a > bswap(a, b),保证 \(a \le b\)
      • b > cswap(b, c),保证 \(b \le c\)(此时 \(c\) 为最大值)
      • a > bswap(a, b),再次保证 \(a \le b\)(因第二步可能改变 \(a, b\) 的相对顺序)
    • 输出结果printf("%d %d %d", a, b, c)
  4. 时间/空间复杂度

    • 时间复杂度:\(O(1)\),固定三次比较交换
    • 空间复杂度:\(O(1)\),原地交换无需额外空间
  5. 三元素排序的核心思想

    • 冒泡排序的简化:对三个元素,冒泡排序最多需要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
posted @ 2026-08-05 15:47  团爸讲算法  阅读(24)  评论(0)    收藏  举报