我想要将一个二维数组按照最后一行从大到小排序。然后我从网上搜到的做法是,因为求二维数组按列排序比较简单,所以我进行了转置,然后再使用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变换成你要的43。
【以下回答由 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");
}
}
现在,代码按照最后一行从大到小重新排序,并正确输出了结果。
【相关推荐】