1 条题解
-
0
思路
经典冒泡排序:反复扫描数组,每次比较相邻两个数,如果前面的比后面的大就交换。用标志位
flag记录这一轮有没有发生交换,某一轮一次都没交换,说明已经排好,提前结束。代码
#include <stdio.h> int main() { int n, a[10000]; scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d", &a[i]); int flag = 1; while (flag) { flag = 0; // 每轮开始先假设已排好 for (int i = 0; i < n - 1; i++) { if (a[i] > a[i + 1]) { int t = a[i]; a[i] = a[i + 1]; a[i + 1] = t; flag = 1; // 发生交换,还得再来一轮 } } } for (int i = 0; i < n; i++) printf("%d%c", a[i], i == n - 1 ? '\n' : ' '); return 0; }易错点
- 交换要用临时变量
t,三行完成。 - 冒泡排序时间复杂度是 O(n²),n = 10000 时约一亿次比较,1 秒内勉强通过;如果超时可以换"选择排序"或
qsort。
- 交换要用临时变量
- 1
信息
- ID
- 18
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 1
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者
吉公网安备22010402001496号