【问题标题】:How to sort a matrix by the sum of the rows in C如何通过C中的行总和对矩阵进行排序
【发布时间】:2020-11-24 15:39:22
【问题描述】:

如何通过C中的行总和对矩阵进行排序?

例如:

第一个矩阵是:

M1 = [1, 2, 3, 4]
     [9, 10, 11, 12]
     [5, 6, 7, 8]

我想得到这个(降序):

M2 = [9, 10, 11, 12]
     [5, 6, 7, 8]
     [1, 2, 3, 4] 

第一行的总和 - 1+2+3+4=10

第二行的总和 - 9+10+11+12=42

第三行的总和 - 5+6+7+8=26

第二行的总和 > 第三行的总和 > 第一行的总和

初步实施:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    printf("***Program***\n\n");
    int k=4;
    int v=4;
    int M[k][v], i, j, sumrow;
    
    for(i=0; i<k; i++)
        for(j=0; j<v; j++)
        {
            printf("\n%d. row element and %d. column element: ", j+1, i+1);
            scanf("%d", &M[i][j]);  
        }   
    
    printf("\n\n***Print Matrix***:");
    for(i=0; i<k; i++)
    {
        printf("\n");
        for(j=0; j<v; j++)
        printf("%d ", M[i][j]);
    }
    printf("\n\n");
    
    for(i=0; i<k; i++)
    {
        sumrow=0;
        for(j=0; j<v; j++)
            sumrow+=M[i][j];
        printf("\nSum of %d. row : %d", i+1, sumrow);   
    }
    printf("\n\n");
}

提前致谢!

【问题讨论】:

  • 你有初始实现吗?
  • 你还在纠结什么?请关注以下问题之一:a) 正确存储矩阵 b) 对简单的整数数组进行排序 c) 确定行的总和 d) 交换两行 对于所有您没有问题的问题,请提供 @ 987654321@,让您更轻松地解决眼前的问题。
  • 您可以编写一个可与​​标准 C qsort() 函数一起使用的比较器。这并不是特别容易,尤其是因为每次比较时都必须计算每行的行总和(如果矩阵很宽,则速度很慢),并且您无法获得有用(重要)的信息,例如作为参数传递的行大小到功能。如果您正在编写自己的排序代码,则可以预先计算行和,然后对行和数组和矩阵进行并行排序。但是你没有显示你在哪里遇到问题。您需要展示您尝试过的内容并解释您遇到的问题。
  • 以防万一这与家庭作业有关:meta.stackoverflow.com/questions/334822/…

标签: c sorting matrix


【解决方案1】:

这是一个可能的实现:

#include<stdio.h>

int sum(int *row, int size) {
    int s = 0;
    for (size--; size >= 0; size--) s += row[size];
    return s;
}

int main() {
    int matrix[3][4] = {{1, 2,  3,  4},
                        {9, 10, 11, 12},
                        {5, 6,  7,  8}};

    int tmp;

    printf("Before:\n");
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }

    // Bubble sort.
    for (int i = 0; i < 2; i++) {
        for (int j = i + 1; j < 3; j++) {
            // Comparing row value.
            if (sum(matrix[i], 4) > sum(matrix[j], 4)) {
                // Swapping.
                for (int k = 0; k < 4; k++) {
                    tmp = matrix[i][k];
                    matrix[i][k] = matrix[j][k];
                    matrix[j][k] = tmp;
                }
            }
        }
    }

    printf("After:\n");
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }

    return 0;
}

输出:

Before:
1 2 3 4
9 10 11 12
5 6 7 8
After:
1 2 3 4
5 6 7 8
9 10 11 12

一些见解:

  • 我的实现基于二维数组。
  • 使用比较功能使其更清晰。
  • 由于这些不是指针,因此交换需要逐项进行,如果使用指针,则可以进行优化。

【讨论】:

    猜你喜欢
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 2015-01-31
    相关资源
    最近更新 更多