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

使用Bubble Sort对C语言二维矩阵排序未达预期结果

二维矩阵冒泡排序失效问题排查

你的代码能正常编译运行但完全没排序效果,核心问题出在冒泡排序的比较逻辑和循环边界处理上,具体错误如下:

1. 无效的交换判断条件

代码里的if (crow > nrow)完全写反了逻辑:

  • 当处理当前元素(j,k)时,下一个元素要么是同行的(j,k+1),要么是下一行的(j+1,0)
  • 此时nrow要么等于crow(同行),要么比crow大(下一行),crow > nrow永远为假,导致交换代码根本不会执行,矩阵自然没变化

2. 数组越界问题

当处理到最后一行的最后一个元素时,nrow = j + 1会等于总行数a,此时访问x[nrow][ncol]属于越界访问,触发未定义行为(虽然没报错,但逻辑完全错误)

3. 冒泡排序循环逻辑冗余

外层循环遍历a*b次没必要,冒泡排序只需要a*b-1次循环(最后一个元素会自动归位);内层遍历整个矩阵也会做很多无效比较。


修正后的代码

把二维矩阵当成一维数组来处理,通过索引转换映射到二维坐标,逻辑更清晰:

#include <stdio.h>

int main() {
    int a;
    printf("Enter the number of rows: ");
    scanf("%d", &a);
    int b;
    printf("Enter the number of columns: ");
    scanf("%d", &b);
    int x[a][b];

    // 输入矩阵元素
    for (int i = 0; i < a; i++) {
        for (int j = 0; j < b; j++) {
            printf("Enter element at row %d column %d: ", i + 1, j + 1);
            scanf("%d", &x[i][j]);
        }
    }

    // 冒泡排序:把二维矩阵视为一维数组,总元素数为a*b
    int total = a * b;
    for (int i = 0; i < total - 1; i++) {
        // 每次循环把最大的元素"冒"到未排序部分的末尾
        for (int k = 0; k < total - 1 - i; k++) {
            // 转换为二维坐标
            int curr_row = k / b;
            int curr_col = k % b;
            int next_row = (k + 1) / b;
            int next_col = (k + 1) % b;

            // 相邻元素比较交换
            if (x[curr_row][curr_col] > x[next_row][next_col]) {
                int temp = x[curr_row][curr_col];
                x[curr_row][curr_col] = x[next_row][next_col];
                x[next_row][next_col] = temp;
            }
        }
    }

    // 输出排序后的矩阵
    printf("Sorted matrix:\n");
    for (int i = 0; i < a; i++) {
        for (int j = 0; j < b; j++) {
            printf("%d ", x[i][j]);
        }
        printf("\n");
    }

    return 0;
}

关键修正点

  • 用total = a*b统一处理总元素数,避免二维坐标的复杂判断
  • 内层循环每次遍历到total-1-i,减少已排序部分的重复比较
  • 通过k/b和k%b将一维索引转换为二维坐标,逻辑更直观,不会出现越界问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 03:43:32