酷代码 AI
菜单
服务商

C++ 实现优化选择排序从大到小排列输入数字

🔍以下是按照你提供的代码框架,完善后的代码及详细解释: ```cpp #include <iostream> using namespace std; int n, a[100]; int main() { cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; } // 选择排序过程 for (int i = 1; i <= n - 1; i++) { int maxj = i; // 内层循环,从 i+1 开始到 n 寻找最大值的索引 for (int j = i + 1; j <= n; j++) { // 如果当前元素 a[j] 大于当前记录的最大值 a[maxj] if (a[j] > a[maxj]) { // 更新最大值的索引为 j maxj = j; } } // 交换 a[i] 和 a[maxj] 的值 int t = a[i]; a[i] = a[maxj]; a[maxj] = t; } // 输出排序后的数组 for (int i = 1; i <= n; i++) { cout << a[i] << " "; } return 0; } ``` ### 代码详细解释: #### 1. 输入部分 ```cpp cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; } ``` - 首先,程序从标准输入读取一个整数 `n`,它代表要排序的元素数量。 - 接着,使用 `for` 循环从标准输入读取 `n` 个整数,并将它们存储在数组 `a` 中,数组的索引从 `1` 开始。 #### 2. 选择排序部分 ```cpp for (int i = 1; i <= n - 1; i++) { int maxj = i; for (int j = i + 1; j <= n; j++) { if (a[j] > a[maxj]) { maxj = j; } } int t = a[i]; a[i] = a[maxj]; a[maxj] = t; } ``` - **外层循环**:`for (int i = 1; i <= n - 1; i++)` 控制排序的轮数。因为选择排序每一轮会确定一个最大值的位置,所以总共需要进行 `n - 1` 轮排序。 - **内层循环**:`for (int j = i + 1; j <= n; j++)` 用于在未排序的部分(从 `i + 1` 到 `n`)中寻找最大值的索引。`maxj` 初始化为 `i`,表示当前假设 `a[i]` 是最大值。 - **比较与更新**:在内层循环中,通过 `if (a[j] > a[maxj])` 比较当前元素 `a[j]` 和当前记录的最大值 `a[maxj]`。如果 `a[j]` 更大,则更新 `maxj` 为 `j`,表示找到了一个更大的值。 - **交换操作**:内层循环结束后,`maxj` 存储了未排序部分中最大值的索引。通过临时变量 `t`,交换 `a[i]` 和 `a[maxj]` 的值,将最大值放到当前未排序部分的第一个位置。 #### 3. 输出部分 ```cpp for (int i = 1; i <= n; i++) { cout << a[i] << " "; } ``` - 使用 `for` 循环遍历排序后的数组 `a`,并将每个元素输出,元素之间用空格分隔。 ### 复杂度分析: - **时间复杂度**:选择排序的时间复杂度为 $O(n^2)$,因为有两层嵌套的循环,外层循环执行 `n - 1` 次,内层循环的执行次数逐渐减少,但总体上时间复杂度是 $n$ 的平方级别。 - **空间复杂度**:$O(1)$,只使用了常数级的额外空间,主要用于存储临时变量 `t` 和索引 `maxj`。 ######[AI问答 | 1020点数解答 | 2026-04-11 19:31:22]

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