C qsort按行的平均值和列数对矩阵进行排序

时间:2017-04-25 07:18:48

标签: c matrix qsort

我想按行(行的平均值)和列式(元素的值)对数字矩阵进行排序。我写了一些代码,但有一些错误。我的代码出了什么问题?

#include <stdio.h>
#include <stdlib.h>
void print_array(int **matrix, int row, int col)
{
    int (*p)[col] = (int (*)[col])*matrix;
    for(int i = 0; i < row; ++i)
    {
        for(int j = 0; j < col; ++j)
        {
            printf("%d\t", p[i][j]);
        }
        printf("\n");
    }
}
int compare_avg(const void * a, const void * b)
{
    double avg_a = 0.0, avg_b = 0.0;
    const int *pa =  *(const int **)a;
    const int *pb =  *(const int **)b;
    for(int i = 0; i < 4; ++i)
    {
        avg_a += pa[i]/4.0;
        avg_b += pb[i]/4.0;
    }
    if(avg_a > avg_b) return 1;
    if(avg_a < avg_b) return -1;
    return 0;
}
int compare(const void* pa, const void* pb)
{
    const int a = *(const int*)pa;
    const int b = *(const int*)pb;
    if(a < b) return -1;
    if(a > b) return 1;
    return 0;
}
void sort_array(int **matrix, int row, int col)
{
    int (*p)[col] = (int (*)[col])*matrix;
    for(int i=0; i<row; ++i)
        qsort(p[i], col, sizeof(int), compare);
    print_array(matrix, row, col);
    printf("####################################\n");
    qsort(matrix, row, sizeof(matrix[0]), compare_avg);
    print_array(matrix, row, col);
}


int main(int argc, char* argv[])
{
    int array[5][4] = {
                {1,2,-1, -1},
                {3,2,-10,0},
                {4,2,1,0},
                {0,1,0,0},
        };
    int *p = &array[0][0];
    printf("%ld\n",sizeof(array)/sizeof(array[0]));
    printf("%ld\n",sizeof(array[0])/sizeof(int));
    print_array(&p, sizeof(array)/sizeof(array[0]), sizeof(array[0])/sizeof(int));
    printf("#########################################\n");
    sort_array(&p, sizeof(array)/sizeof(array[0]), sizeof(array[0])/sizeof(int));
    return 0;
} 

我需要的输出是{{-10,0,3,2},{0,0,0,1},{-1,-1,1,2},{0,1,2,4 }}

0 个答案:

没有答案