C++优化冒泡排序实现从大到小排序
### 🍭思路分析 冒泡排序是一种简单的排序算法,它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。为了优化冒泡排序,我们可以设置一个标志位,当某一轮没有发生交换时,说明数组已经有序,可以提前结束排序。 ### 🔧代码实现 ```cpp #include <iostream> using namespace std; int main() { int n; cin >> n; int arr[100]; for (int i = 0; i < n; i++) { cin >> arr[i]; } // 优化后的冒泡排序 bool swapped; for (int i = 0; i < n - 1; i++) { swapped = false; for (int j = 0; j < n - i - 1; j++) { if (arr[j] < arr[j + 1]) { // 交换 arr[j] 和 arr[j+1] int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; swapped = true; } } // 如果没有发生交换,说明数组已经有序,提前结束排序 if (!swapped) { break; } } // 输出排序后的数组 for (int i = 0; i < n; i++) { if (i > 0) { cout << " "; } cout << arr[i]; } cout << endl; return 0; } ``` ### 📝代码解释 1. **输入处理**:首先读取一个整数 `n`,表示数组的长度。然后读取 `n` 个整数,存储在数组 `arr` 中。 2. **优化的冒泡排序**: - 使用一个布尔变量 `swapped` 来记录每一轮是否发生了交换。 - 外层循环控制排序的轮数,最多进行 `n - 1` 轮。 - 内层循环比较相邻的元素,如果顺序错误则交换它们,并将 `swapped` 设置为 `true`。 - 如果某一轮没有发生交换,说明数组已经有序,提前结束排序。 3. **输出结果**:遍历排序后的数组,输出每个元素,相邻元素之间用空格隔开。 ### 🚀复杂度分析 - **时间复杂度**:平均情况下为 $O(n^2)$,但在数组已经有序的情况下,时间复杂度可以优化到 $O(n)$。 - **空间复杂度**:$O(1)$,只使用了常数级的额外空间。 ######[AI写代码神器 | 632点数解答 | 2026-03-20 19:46:45]
- 解析React 15与Vue 2:从O(n^3)到O(n),Diff算法时间复杂度计算及性能对比 (阿里通义 | 379点数解答 | 2023-11-09 01:49:19)331
- 缜密逻辑,全新无名杀“风餐”技能代码精心打造与深度解析 (字节豆包 | 469点数解答 | 2025-04-05 11:37:06)238
- 精准优化:明确需求,开启高效提升之旅! (字节豆包 | 52点数解答 | 2026-02-09 16:44:46)33
- 代码再升级:优化版“获取dump”代码,多机制保障数据读取与保存(字节豆包 | 734点数解答 | 2026-02-10 01:23:31)61
- 代码深度优化:全面检查异常、灵活读取内存,提升可读性与可维护性(字节豆包 | 959点数解答 | 2026-02-10 01:24:14)32
- C语言实现多班级学生信息管理系统:含增删改查与多样排序功能(GPT | 2547点数解答 | 2024-12-15 22:08:58)356
- C语言实现学生信息管理系统:含增删改查与多种排序功能(GPT | 6408点数解答 | 2024-12-15 22:10:03)347
- sys_module 表结构与 Java 实体类 SysModule 详解(字节豆包 | 252点数解答 | 2025-04-09 10:54:17)212
- MySQL表与Java类:`sys_role` 的创建及实体类定义全解析(字节豆包 | 168点数解答 | 2025-04-10 14:39:47)214
- C++ 破解“国王游戏”弱化版:贪心排序算法巧求最少最大奖赏(DeepSeek | 550点数解答 | 2025-04-28 18:16:50)395
- 巧妙贪心排序:解决国王游戏中大臣奖赏最大化问题(DeepSeek | 1002点数解答 | 2025-05-10 20:58:15)191
- C++ 实现:用贪心算法解国王游戏(弱化版),使大臣获赏最大值最小(DeepSeek | 507点数解答 | 2025-05-10 20:59:01)173