C语言 对矩阵排序

fnx2tebb  于 2022-12-22  发布在  其他
关注(0)|答案(2)|浏览(239)

我试着用一个矩阵的行的数字之和来排序,从最高到最低,我不知道我解释的对不对,所以这里有一些照片来解释。

这就是我的代码输出的结果。基本上,它要求你输入m和n,这是矩阵的维数。在这个例子中,它是一个3x4,3行和4列。然后,矩阵应该按行排序,按行的位数之和排序。这意味着,与上图中输出的结果不同,正确的结果应该是:

我不知道如何排序这从最高到最低,我已经尝试了几个小时,但无济于事.这里是我的代码:

#include <stdio.h>
#define N 30
    
void main(){
double a[N][N], s[N], p;
int i, j, m, n, max;

while(1){
    
    printf("\nm, n? ");
    scanf("%d%d", &m, &n);

    if(m <= 0 || m > N || n <=0 || n > N)
        break;

    for(i = 0; i < m; i++){
        printf("%2d. row? ", i+1);
        for(j = 0; j < n; scanf("%lf", &a[i][j++]));
    }
    
    for(i = 0; i < m; i++)
    for(s[i] = j = 0; j < n; s[i] += a[i][j++]);

    for(j = 0; j < n - 1; j++){
        for(max = i, j = i+1; j < n; j++)
            if(s[j] > s[max])
                max = i;
                if(max != j){
                    p = s[j];
                    s[j] = s[max];
                    s[max] = p;
                    for(j = 0; j < m; j++){
                        p = a[j][i];
                        a[j][i] = a[j][max];
                        a[j][max] = p;
                    }
                }
    }
    printf("New matrix: \n");

    for(i = 0; i < m; i++){
        for(j = 0; j < n; printf("%8.2lf", a[i][j++]));
        printf("\n");
    }
    for(j = 0; j < m; j++)
        printf("-------------");
    printf("\n");
    for(j = 0; j < m; printf("%8.2f \n", s[j++]));
    printf("\n"); 
}
}
oxcyiej7

oxcyiej71#

您可以使用简单的冒泡排序算法,从最高到最低对矩阵的行进行排序。代码修改如下:

int main() {

  double a[N][N], s[N], p;
  int i, j, m, n, max;

  while (1) {
    printf("\nm, n? ");
    scanf("%d%d", & m, & n);

    if (m <= 0 || m > N || n <= 0 || n > N)
      break;

    for (i = 0; i < m; i++) {
      printf("%2d. row? ", i + 1);
      for (j = 0; j < n; scanf("%lf", & a[i][j++]));
    }

    for (i = 0; i < m; i++)
      for (s[i] = j = 0; j < n; s[i] += a[i][j++]);

    for (i = 0; i < m - 1; i++) { // modified here
      for (j = i + 1; j < m; j++) { // modified here
        if (s[j] > s[i]) { // modified here
          p = s[i];
          s[i] = s[j];
          s[j] = p;
          for (int k = 0; k < n; k++) {
            p = a[i][k];
            a[i][k] = a[j][k];
            a[j][k] = p;
          }
        }
      }
    }
    printf("New matrix: \n");

    for (i = 0; i < m; i++) {
      for (j = 0; j < n; printf("%8.2lf", a[i][j++]));
      printf("\n");
    }
    for (j = 0; j < m; j++)
      printf("-------------");
    printf("\n");
    for (j = 0; j < m; printf("%8.2f \n", s[j++]));
    printf("\n");
  }

  return 0;
}
  • 以下是我如何修改您的代码来实现这一点:*
  • 将循环变量i初始化为0。
  • 在外部循环中,从i +1到m-1运行内部循环j。
  • 在内部循环中,比较第i行的和与第j行的和。如果第j行的和大于第i行的和,则使用临时变量交换行。
  • 内部循环完成后,将i的值递增1。重复外部循环,直到i等于m-1。
    • 输出**:

0qx6xfy6

0qx6xfy62#

您可以只使用qsort让它处理排序和项交换,然后您只需要编写比较两行的代码。
假设如下:

int matrix[3][4] = 
{
  {1,2,3,4},
  {5,6,7,8},
  {9,1,2,3},
};

可以将qsort称为:

qsort(matrix, 3, sizeof(int[4]), compare);

唯一复杂的是实现比较回调函数,这里有两件事需要考虑:

  • 我们已经告诉qsort我们有一个包含3个元素的数组,每个元素都是int[4]类型,所以它传递给我们的void指针实际上是指向int[4]类型的指针,即:int(*)[4].
  • qsort在默认情况下按升序排序,其中被认为"较小"的项最先结束,所以我们需要调整它,首先获得最大的项。

示例:

int compare (const void* obj1, const void* obj2)
{
  const int (*ptr1)[4] = obj1;
  const int (*ptr2)[4] = obj2;
  size_t sum1=0;
  size_t sum2=0;

  for(size_t i=0; i<4; i++)
  {
    sum1 += (*ptr1)[i];
    sum2 += (*ptr2)[i];
  }

  if(sum1 > sum2) // largest sum considered "less" for qsort
    return -1;
  else
    return 1;
  return 0;
}

sum1 < sum2将首先放置最小的行。
完整示例:

#include <stdio.h>
#include <stdlib.h>

int compare (const void* obj1, const void* obj2)
{
  const int (*ptr1)[4] = obj1;
  const int (*ptr2)[4] = obj2;
  size_t sum1=0;
  size_t sum2=0;
  
  for(size_t i=0; i<4; i++)
  {
    sum1 += (*ptr1)[i];
    sum2 += (*ptr2)[i];
  }

  if(sum1 > sum2) // largest sum considered "less" for qsort
    return -1;
  else
    return 1;
  return 0;
}

void print_matrix(size_t col, size_t row, int matrix[col][row])
{
  for(size_t i=0; i<col; i++)
  {
    for(size_t j=0; j<row; j++)
    {
      printf("%d,", matrix[i][j]);
    }
    puts("");
  }
}

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

  print_matrix(3,4,matrix);
  puts("");
  qsort(matrix, 3, sizeof(int[4]), compare);
  print_matrix(3,4,matrix);
}

相关问题