使用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
相关产品推荐
相关产品推荐

