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;
}