You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

冒泡排序代码异常求助:C语言排序实现错误排查与修正

冒泡排序代码错误修正

你的代码存在多个关键问题,导致无法正常实现冒泡排序,以下是问题梳理和修正方案:

1. 基础语法错误

int array[20], n,; 这行多了一个多余的逗号,属于语法错误,会直接导致编译失败。

2. Swap函数传值无效

你写的swap函数是传值调用,函数内部交换的只是参数的临时副本,完全不会影响原数组里的元素。要实现对原数组元素的修改,必须用指针传递变量的内存地址。

3. 冒泡排序循环逻辑混乱

  • 冒泡排序需要两层嵌套循环:外层循环控制排序轮数(最多n-1轮,每轮会把当前最大的元素"冒"到数组末尾),内层循环控制每轮中相邻元素的比较交换;
  • 原代码的for循环括号不匹配,else的位置完全错误,导致语法结构混乱;
  • 原循环条件j < n会触发数组越界:数组下标最大为n-1,当j取到n-1时,array[j+1]会访问超出数组范围的内存,产生乱码。

4. 多余的无效操作

swap(array[1], array[2]); 这行代码不仅多余,而且因为传值调用的问题,根本不会改变数组元素的实际值。

5. 缺少排序结果输出

你没有编写任何输出排序后数组的代码,原输出里的乱码是因为越界访问了未初始化的数组内存区域。


修正后的完整代码

#include<stdio.h>

// 用指针传递地址,实现对原变量的修改
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int array[20], n;
    printf("请输入要排序的整数个数: ");
    scanf("%d", &n);
    printf("请输入这些整数: ");
    for (int i = 0; i < n; i++) {
        scanf("%d", &array[i]);
    }

    // 冒泡排序核心逻辑
    // 外层循环:控制排序轮数,最多n-1轮
    for (int j = 0; j < n - 1; j++) {
        // 内层循环:每轮只比较到未排序的最后一个元素,避免重复比较
        for (int k = 0; k < n - 1 - j; k++) {
            if (array[k] > array[k + 1]) {
                swap(&array[k], &array[k + 1]); // 传递元素的地址给swap函数
            }
        }
    }

    // 输出排序后的结果
    printf("排序后的数组: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");

    return 0;
}

修正说明

  1. 修复了变量声明的语法错误,移除多余逗号;
  2. 将swap函数改为指针传参,确保能直接修改原数组元素,同时将返回类型改为void(因为函数不需要返回值);
  3. 重构冒泡排序的两层循环:外层循环控制轮数,内层循环缩小比较范围,避免数组越界和无效比较;
  4. 删除了多余的无效swap调用;
  5. 添加了排序结果的输出代码,清晰展示最终排序效果。

测试输入5和5 4 3 2 1,会输出排序后的数组: 1 2 3 4 5 ,符合预期。

内容的提问来源于stack exchange,提问作者Vishwas Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 18:06:39