C:使用 qsort 逐行排序二维数组
C: sorting 2d arrays row by row using qsort
所以,我在这里想要实现的是在二维数组中使用 qsort 的 C 实现,在 我只想根据第一个元素对行进行排序,例如:
int arr[3][2]={{65,1},
{45,2},
{66,3}}
我希望输出为:
int arr[3][2]={{45,2},
{65,1},
{66,3}}
有没有办法在不自己实现快速排序的情况下做到这一点?如果是,怎么做?
编辑
这是我的代码的样子:
int f(int a, int b)
{
return a-b;
}
qsort(arr[0],3,sizeof(int),f);
您不是在对整数进行排序,您是在对 "things" 恰好是多个整数的大小进行排序。
所以,不要对元素大小撒谎 qsort()
:
#include <stdio.h>
#include <stdlib.h>
static int cmprow(const void *a, const void *b)
{
const int * const ia = a, * const ib = b;
return ia[0] < ib[0] ? -1 : ia[0] > ib[0];
}
int main(void) {
int arr[3][2]={{65,1},
{45,2},
{66,3}};
qsort(arr, sizeof arr / sizeof *arr, sizeof *arr, cmprow);
for (size_t i = 0; i < sizeof arr / sizeof *arr; ++i)
{
for (size_t j = 0; j < sizeof *arr / sizeof **arr; ++j)
printf("%d ", arr[i][j]);
putchar('\n');
}
return 0;
}
这会打印:
45 2
65 1
66 3
这是问题所在:
qsort(arr[0],3,sizeof(int),f);
这个函数将size_t
作为第二个参数。您已经超过了 3。这不是大小,而是数组 arr
中元素的数量。粗略地说,你需要像 3*sizeof(int)
这样的东西。或者更好 sizeof(arr) / sizeof *arr
。
所以,将其更改为
qsort(arr, sizeof(arr) / sizeof *arr, sizeof(int), sizeof *arr, comparator);
与:
int comparator(const void *p, const void *q)
{
// Get the values at given addresses
int l = *(const int *)p;
int r = *(const int *)q;
// both odd, put the greater of two first.
if ((l&1) && (r&1))
return (r-l);
// both even, put the smaller of two first
if ( !(l&1) && !(r&1) )
return (l-r);
// l is even, put r first
if (!(l&1))
return 1;
// l is odd, put l first
return -1;
}
所以,我在这里想要实现的是在二维数组中使用 qsort 的 C 实现,在 我只想根据第一个元素对行进行排序,例如:
int arr[3][2]={{65,1},
{45,2},
{66,3}}
我希望输出为:
int arr[3][2]={{45,2},
{65,1},
{66,3}}
有没有办法在不自己实现快速排序的情况下做到这一点?如果是,怎么做?
编辑
这是我的代码的样子:
int f(int a, int b)
{
return a-b;
}
qsort(arr[0],3,sizeof(int),f);
您不是在对整数进行排序,您是在对 "things" 恰好是多个整数的大小进行排序。
所以,不要对元素大小撒谎 qsort()
:
#include <stdio.h>
#include <stdlib.h>
static int cmprow(const void *a, const void *b)
{
const int * const ia = a, * const ib = b;
return ia[0] < ib[0] ? -1 : ia[0] > ib[0];
}
int main(void) {
int arr[3][2]={{65,1},
{45,2},
{66,3}};
qsort(arr, sizeof arr / sizeof *arr, sizeof *arr, cmprow);
for (size_t i = 0; i < sizeof arr / sizeof *arr; ++i)
{
for (size_t j = 0; j < sizeof *arr / sizeof **arr; ++j)
printf("%d ", arr[i][j]);
putchar('\n');
}
return 0;
}
这会打印:
45 2
65 1
66 3
这是问题所在:
qsort(arr[0],3,sizeof(int),f);
这个函数将size_t
作为第二个参数。您已经超过了 3。这不是大小,而是数组 arr
中元素的数量。粗略地说,你需要像 3*sizeof(int)
这样的东西。或者更好 sizeof(arr) / sizeof *arr
。
所以,将其更改为
qsort(arr, sizeof(arr) / sizeof *arr, sizeof(int), sizeof *arr, comparator);
与:
int comparator(const void *p, const void *q)
{
// Get the values at given addresses
int l = *(const int *)p;
int r = *(const int *)q;
// both odd, put the greater of two first.
if ((l&1) && (r&1))
return (r-l);
// both even, put the smaller of two first
if ( !(l&1) && !(r&1) )
return (l-r);
// l is even, put r first
if (!(l&1))
return 1;
// l is odd, put l first
return -1;
}