首页 > 解决方案 > 如何通过C中的行总和对矩阵进行排序

问题描述

如何按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

第 2 行总和>第 3 行总和>第 1 行总和

初步实施:

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

提前致谢!

标签: csortingmatrix

解决方案


这是一个可能的实现:

#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

一些见解:

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

推荐阅读