qSort函数 对二维数组按照最后一行进行排序

我想要将一个二维数组按照最后一行从大到小排序。然后我从网上搜到的做法是,因为求二维数组按列排序比较简单,所以我进行了转置,然后再使用qsort做法,但是为什么输出结果不正确,有人可以帮忙看一看吗?

#include <stdio.h>
#include <stdlib.h>
int b_arr[][3] = { {3, 2, 5},
                   {1, 1, 8},
                   {6, 2, 9},
                   {9, 2, 4} };
                   
int cmp2(const void* a, const void* b) // 2D Matrix
{
    return ((int *)a)[1] - ((int *)b)[1];
}

int main()
{
    printf("Hello world!\n");
    int i, j;

//    qsort(b_arr, 3, 3 * sizeof(int), cmp2);
    
    int crr[3][4];
    for (i = 0; i < 3; i++){
        for (j = 0; j < 4; j++){
            crr[i][j] = b_arr[j][i];
        }
    }

    printf("Here \n");
    for (i = 0; i < 3; i++){
        for (j = 0; j < 4; j++){
            printf("%d ", crr[i][j]);
        }
        printf("\n");
    }
    qsort(crr, 4, 4 * sizeof(int), cmp2);
    printf("After sorted: \n");
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 4; j++) {
            printf("%d ", crr[i][j]);
        }
        printf("\n");
    }

    return 0;
}

如果解决您的问题,请点赞采纳,谢谢。
————————————————————
1、第34行改成qsort(crr, 3, 4 * sizeof(int), cmp2);因为你的crr数组是3*4,第二个参数表示元素的个数,也就是3个4元素的数组。
2、第11行改成return ((int *)a)[3] - ((int )b)[3];因为你是要根据最后一个排序。
2、输出正确之后,后面你还需要把排序好的crr变换成你要的4
3。

img

【以下回答由 GPT 生成】

这段代码的问题在于在转置数组的过程中,写入的位置不正确。由于数组转置后的行数变成了4行,列数变成了3列,所以在写入转置数组时,应该将crr[i][j]改为crr[j][i]。另外,对于使用qsort进行排序时,比较函数中的索引应该修改为2,以便正确比较最后一行的元素。以下是修改后的代码:

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

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

int cmp2(const void* a, const void* b) // 2D Matrix
{
    return ((int *)a)[2] - ((int *)b)[2];
}

int main()
{
    printf("Hello world!\n");
    int i, j;

    int crr[3][4];
    for (i = 0; i < 3; i++){
        for (j = 0; j < 4; j++){
            crr[j][i] = b_arr[i][j];
        }
    }

    printf("Here \n");
    for (i = 0; i < 3; i++){
        for (j = 0; j < 4; j++){
            printf("%d ", crr[i][j]);
        }
        printf("\n");
    }
    qsort(crr, 4, 4 * sizeof(int), cmp2);
    printf("After sorted: \n");
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 4; j++) {
            printf("%d ", crr[j][i]);
        }
        printf("\n");
    }
}

现在,代码按照最后一行从大到小重新排序,并正确输出了结果。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^