【问题标题】:Sorting a **Matrix structure对**矩阵结构进行排序
【发布时间】:2015-08-27 18:42:06
【问题描述】:

我会在 C 中对一个**矩阵结构进行排序(升序/降序无关紧要),我已经尝试过使用下面的这种排序(冒泡排序)函数,但似乎不起作用。怎么了?还有其他一些有效/清晰的方法来对矩阵进行排序吗?谢谢:-)

void sortMatrix(int **matrix,int nrow,int ncol)
{
    int i, j;
    int temp;

    temp=0;

    i=0;
    while( i <nrow)
    {
        j=0;
        while (j < ncol-1)
        {
            //printf("Matrix pos:[%d,%d] val:%d and matrix pos:[%d,%d] val: %d\n", i,j, matrix[i][j], i,j+1, matrix[i][j+1]);
            if(matrix[i][j] < matrix[i][j+1])
            {

                temp= matrix[i][j];
                matrix[i][j]=  matrix[i][j+1];
                matrix[i][j]= temp;
            }
            j++;
        }
        i++;
    }

}

这是主要的,矩阵是动态分配的:

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

#include"MatrixIO.h"

int main(void) {

    int **matrix= NULL;
    //int i, j;
    int nrow, ncol;

    //i= j= 0;

    srand(time(NULL));

    printf("inser NxM size\n");
    scanf("%d %d", &nrow, &ncol);

    matrix= allocMatrix(matrix, nrow, ncol);

    fillRandMatrix(matrix, nrow, ncol);
    printMatrix(matrix, nrow, ncol);

    printf("Sorted:\n");
    sortMatrix(matrix, nrow, ncol);
    printMatrix(matrix, nrow, ncol);


    system("pause");
    return EXIT_SUCCESS;
}

编辑:

矩阵中的元素应该从小到大排序

34 12  2 21 98  >>>>>  2  12 21 23 33 
24 45 69 98 777 >>>>> 34 45 69 98 777

【问题讨论】:

  • 第 1 步是通过对矩阵进行排序来定义您的意思。您是对每一行中的元素进行排序,然后按它们的第一个元素对行进行排序,还是将整个矩阵中的最小元素移动到第一行/第一列?
  • OT:行和列的变量应该是size_t,以及计数器ij
  • @user3386109 是的,我将矩阵元素从最小到最大排序,我添加了一个示例。
  • @CSDude 你现在问的是另一个问题“我该怎么办?”这与您的“有什么问题?”不同
  • 在这种情况下,您可以简单地将矩阵视为一维数组并使用qsort 对其进行排序。如果愿意,我会让@WeatherVane 将其添加到答案中。

标签: c sorting matrix dynamic bubble-sort


【解决方案1】:

这里是交换错误

temp= matrix[i][j];
matrix[i][j]=  matrix[i][j+1];
matrix[i][j]= temp;

应该是

temp= matrix[i][j];
matrix[i][j]=  matrix[i][j+1];
matrix[i][j+1]= temp;               // <--- j+1

编辑

排序也失败了,因为j 循环可以在i 循环之前开始并反转先前的交换。但目前还不清楚您要以何种方式进行排序。假设您正在尝试对每一行进行排序:

for (k=0; k<nrow; k++) {
    for (i=0; i<ncol-1; i++) {                      //<--- stops with room for j
        for (j=i+1; j<ncol; j++) {                  //<--- starts at i+1
            if(matrix[k][j] < matrix[k][i]) {
                temp= matrix[k][i];
                matrix[k][i]=  matrix[k][j];
                matrix[k][j]= temp;
            }
        }
    }
}

【讨论】:

  • 你是对的..交换是完全错误的,你的函数可以对每一行进行排序,但是如果我应该将所有元素从最小到最大排序呢?谢谢
猜你喜欢
  • 1970-01-01
  • 2020-11-04
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
  • 1970-01-01
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
相关资源
最近更新 更多