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

Posted

技术标签:

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

例如:

第一个矩阵是:

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.***.com/questions/334822/… 【参考方案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

一些见解:

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

【讨论】:

以上是关于如何通过C中的行总和对矩阵进行排序的主要内容,如果未能解决你的问题,请参考以下文章

R中的性能:对矩阵中的行元素进行排序的最快方法是啥?

如何在C语言中通过查看行中的一个属性对文件的行进行排序?

使用vector<vector<int>> c ++按它们的总和对二维矩阵进行排序?

如何使用 Thrust 对矩阵的行进行排序?

如何在熊猫/python中的行标题中通过部分搜索对数据集进行排序

如何允许对不在编辑模式下的 SwiftUI 列表中的行进行重新排序?