酷代码 AI
菜单
服务商
DeepSeek字节豆包
更多选项

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]

相关提问
本站限时免费提问中
实用工具查看更多
Linux在线手册 [开发类]
Jquery在线手册 [开发类]
今日油价 [生活类]
图片互转base64 [开发类]
时间转换器 [开发类]