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

矩阵指定列降序排序异常:BubbleSort算法失效求助

问题分析与修复

你的冒泡排序实现存在两个核心问题,导致无法完成指定列的降序排序:

1. 仅执行一轮遍历,未完成完整排序

冒泡排序需要多层循环:外层循环控制排序轮数(最多需要numberOfRows - 1轮),内层循环负责每一轮中相邻元素的比较与交换。你的代码只做了一轮遍历,仅能完成部分元素交换,无法让整列元素完全有序。

2. 数组下标越界

原循环条件i < numberOfRows会导致当i = numberOfRows - 1时,访问MAT[i+1][givenColumn](即MAT[numberOfRows][givenColumn]),这超出了矩阵的行下标范围(行下标应为0到numberOfRows-1),会触发未定义行为,可能导致程序崩溃或数据异常。


修复后的代码

void Prohod(float MAT[][4], int numberOfRows, int givenColumn) {
    float temp;
    // 外层循环:控制排序轮数,最多需要 numberOfRows - 1 轮
    for (int pass = 0; pass < numberOfRows - 1; pass++) {
        // 内层循环:遍历未排序部分,避免下标越界
        for (int i = 0; i < numberOfRows - pass - 1; i++) {
            // 降序排序:前元素小于后元素则交换
            if (MAT[i][givenColumn] < MAT[i + 1][givenColumn]) {
                temp = MAT[i][givenColumn];
                MAT[i][givenColumn] = MAT[i + 1][givenColumn];
                MAT[i + 1][givenColumn] = temp;
            }
        }
    }
    printf("Given column:%d\n", givenColumn);
}

关键修改说明

  • 新增外层pass循环:确保进行足够轮数的遍历,每一轮会把当前未排序部分的最小元素“沉”到列的末尾(降序场景下)。
  • 调整内层循环条件为i < numberOfRows - pass - 1:每完成一轮排序,末尾的pass个元素已处于有序状态,无需重复比较;同时彻底避免了下标越界问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 06:57:08