C语言二维数组按行和升序重排转存至另一数组的问题求助
问题:按行和排序转存二维数组
现有二维数组matrix1定义如下:
int matrix1[4][5]={ {8,5,2,4,3}, {9,6,4,0,4}, {0,1,2,3,4}, {9,9,9,9,9}};
要求不改变matrix1的行内元素,按行和从小到大的顺序将行转存到matrix2中,仅允许使用for循环、数组、if判断等基础编程技巧,不能使用复制函数。目标matrix2如下:
int matrix2[4][5]={{0,1,2,3,4}, {9,6,4,0,4}, {8,5,2,4,3}, {9,9,9,9,9}};
我编写了以下代码,但无法完成转存到matrix2的步骤,请求帮助:
int i, j, temp, plus = 0; int matris1[4][5] = { {8, 5, 2, 4, 3}, {9, 6, 4, 0, 4}, {0, 1, 2, 3, 4}, {9, 9, 9, 9, 9}}; int matris2[4][5]; int topla[4]; /*here I found sum of the rows*/ for (i = 0; i < 4; i++) { for (j = 0; j < 5; j++) { plus = plus + matris1[i][j]; } topla[i] = plus; plus = 0; } /*here I did the smallest to largest and copy to the array topla */ for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { if (topla[i] < topla[j]) { temp = topla[i]; topla[i] = topla[j]; topla[j] = temp; } } } /* cant transfer to the matrix2 HELP PLEASE :'( */ int k; for (i = 0; i < 4; i++) { for (j = 0; j < 5; j++) { plus = plus + matris1[i][j]; } for (k = 0; k < 4; k++) { if (plus == topla[k]) { matris2[k] = matris1[i]; } } plus = 0; } for (i = 0; i < 4; i++) { for (j = 0; j < 5; j++) { printf("%d - ", matris2[i][j]); } printf("\n"); }
问题分析与修正方案
你的代码存在三个核心问题:
- 排序
topla数组时直接修改了原行和数据,丢失了行和与matrix1对应行的关联关系,排序后无法知道某个行和属于原数组的哪一行。 - C语言中不能直接通过
matris2[k] = matris1[i];赋值数组,必须逐个元素复制。 - 若存在相同行和的情况,会出现重复赋值覆盖的问题(本例虽无,但逻辑上需要规避)。
修正后的代码
#include <stdio.h> int main() { int i, j, temp, plus = 0; int matris1[4][5] = { {8, 5, 2, 4, 3}, {9, 6, 4, 0, 4}, {0, 1, 2, 3, 4}, {9, 9, 9, 9, 9}}; int matris2[4][5]; int topla[4]; int index[4]; // 记录原行索引,关联行和与原数组行 // 计算每行和,初始化索引数组 for (i = 0; i < 4; i++) { index[i] = i; for (j = 0; j < 5; j++) { plus += matris1[i][j]; } topla[i] = plus; plus = 0; } // 选择排序:同步排序行和与对应索引 for (i = 0; i < 3; i++) { int min_idx = i; for (j = i + 1; j < 4; j++) { if (topla[j] < topla[min_idx]) { min_idx = j; } } // 交换行和 temp = topla[i]; topla[i] = topla[min_idx]; topla[min_idx] = temp; // 同步交换索引,保留对应关系 temp = index[i]; index[i] = index[min_idx]; index[min_idx] = temp; } // 按排序后的索引复制行到matrix2 for (i = 0; i < 4; i++) { int original_row = index[i]; for (j = 0; j < 5; j++) { matris2[i][j] = matris1[original_row][j]; } } // 输出验证 for (i = 0; i < 4; i++) { for (j = 0; j < 5; j++) { printf("%d - ", matris2[i][j]); } printf("\n"); } return 0; }
关键修正点
- 新增
index数组,记录每个行和对应的原数组行号,排序时同步交换索引,避免丢失关联关系。 - 使用选择排序完成行和与索引的同步排序,逻辑更清晰高效。
- 通过索引定位原数组行,逐个元素赋值到
matrix2,符合C语言数组操作规则。
内容的提问来源于stack exchange,提问作者senanurr
相关产品推荐
相关产品推荐

