C++冒泡排序实现星耀结晶从大到小排序详解
好的,这是一个非常经典的冒泡排序问题。需要注意题目要求 **从大到小** 排序,所以我们要在比较时调整冒泡的方向。 下面我会用 **C++** 给出实现,并附上详细注释。 --- ### 💡 解题思路 1. **冒泡排序核心思想**: 每一轮通过相邻元素比较,将当前未排序部分的最小值(或最大值)“冒泡”到序列末尾。这里要求从大到小,所以我们每轮将最小的值放到末尾。 2. **实现步骤**: - 外层循环控制轮数(n-1 轮); - 内层循环从第一个元素开始,依次比较相邻两个元素; - 如果前一个元素小于后一个元素,则交换,这样较大的元素会往前移动; - 每轮结束后,最小的元素会移动到正确位置(末尾)。 3. **复杂度**: - 时间复杂度:O(n²) - 空间复杂度:O(1),原地排序。 --- ### 💻 C++ 代码实现 ```cpp #include <iostream> using namespace std; int main() { int n; cin >> n; // 输入结晶数量 int arr[100]; // 题目限定了 n < 100 for (int i = 0; i < n; i++) { cin >> arr[i]; // 输入每个结晶大小 } // 冒泡排序(从大到小) for (int i = 0; i < n - 1; i++) { // 每轮比较相邻元素,将最小值放到末尾 for (int j = 0; j < n - 1 - i; j++) { if (arr[j] < arr[j + 1]) { // 若前一个小于后一个,则交换 // 交换两个数 int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } // 输出排序结果 for (int i = 0; i < n; i++) { cout << arr[i]; if (i != n - 1) { cout << " "; // 相邻数字用空格隔开 } } cout << endl; return 0; } ``` --- ### 🔍 代码详解 - **输入部分**: - 第一行读取 n,第二行读取 n 个整数存入数组。 - **核心排序逻辑**: - 外层循环 `i` 控制轮数,`n-1` 轮即可完成排序; - 内层循环 `j` 从 0 到 `n-1-i`,因为每轮结束后末尾 i 个元素已是正确顺序,无需再比较; - 条件 `arr[j] < arr[j+1]` 是**升序排序的逆条件**,这样大的数会逐渐“冒泡”到前面。 - **输出部分**: - 用循环输出,并在元素之间添加一个空格,最后换行。 --- ### 🧪 测试样例验证 **样例1** 输入: ``` 6 3 1 5 4 14 9 ``` 运行过程(简要): - 第一轮结束:`3 5 4 14 9 1` - 第二轮结束:`5 4 14 9 3 1` - 最终结果:`14 9 5 4 3 1` ✅ **样例2** 输入: ``` 4 7 6 1 4 ``` 输出:`7 6 4 1` ✅ --- ### ⚠️ 开发注意事项 1. **数组大小**:题目给定 `n < 100`,我们使用 `arr[100]` 足够,避免用动态数组增加复杂度。 2. **交换操作**:可以直接使用 C++ 的 `swap(arr[j], arr[j+1])` 简化代码,但为了可读性这里用了临时变量。 3. **边界处理**:注意内层循环的上界为 `n-1-i`,防止数组越界访问。 4. **输入格式**:若使用 `cin` 输入多个整数,会自动忽略空格和换行,无需特殊处理。 --- ### 📌 拓展建议 - 如果想优化性能,可以加入**标志位**(如果一轮中没有发生交换,则提前退出),减少最好情形(如已经排好序)的时间复杂度到 O(n)。 - 在实际项目中,冒泡排序较少用(因为O(n²)效率较低),可以考虑使用 `sort()` 函数(基于快速排序)进行更高效的排序。但本题要求冒泡排序,属于算法基础练习。 --- ######[AI写代码神器 | 1056点数解答 | 2026-08-21 21:13:02]
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)563
- 深度揭秘 Oracle Workarea Size Policy:参数调优助力数据库性能飞升(阿里通义 | 372点数解答 | 2024-05-13 10:54:45)349
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)477
- C语言实现多班级学生信息管理系统:含增删改查与多样排序功能(GPT | 2547点数解答 | 2024-12-15 22:08:58)434
- C语言实现学生信息管理系统:含增删改查与多种排序功能(GPT | 6408点数解答 | 2024-12-15 22:10:03)438
- sys_module 表结构与 Java 实体类 SysModule 详解(字节豆包 | 252点数解答 | 2025-04-09 10:54:17)255
- MySQL表与Java类:`sys_role` 的创建及实体类定义全解析(字节豆包 | 168点数解答 | 2025-04-10 14:39:47)267
- C++ 破解“国王游戏”弱化版:贪心排序算法巧求最少最大奖赏(DeepSeek | 550点数解答 | 2025-04-28 18:16:50)507
- 巧妙贪心排序:解决国王游戏中大臣奖赏最大化问题(DeepSeek | 1002点数解答 | 2025-05-10 20:58:15)247
- C++ 实现:用贪心算法解国王游戏(弱化版),使大臣获赏最大值最小(DeepSeek | 507点数解答 | 2025-05-10 20:59:01)234
- 6 - 4 军事体能成绩冒泡排序:输入轮数输出中间结果的实现(字节豆包 | 250点数解答 | 2025-12-25 15:42:51)89
- 陆军工程大学学员军事体能成绩冒泡排序:按指定轮数输出中间结果(字节豆包 | 250点数解答 | 2025-12-25 15:52:30)102