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

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");
}

问题分析与修正方案

你的代码存在三个核心问题:

  1. 排序topla数组时直接修改了原行和数据,丢失了行和与matrix1对应行的关联关系,排序后无法知道某个行和属于原数组的哪一行。
  2. C语言中不能直接通过matris2[k] = matris1[i];赋值数组,必须逐个元素复制。
  3. 若存在相同行和的情况,会出现重复赋值覆盖的问题(本例虽无,但逻辑上需要规避)。

修正后的代码

#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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 04:20:30