1 条题解

  • 0
    @ 2026-8-18 11:51:30

    思路

    经典冒泡排序:反复扫描数组,每次比较相邻两个数,如果前面的比后面的大就交换。用标志位 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
    上传者