3

假设我们有一个二维数组 A :

    A[3][3] = { {1 ,4 ,7},
                {6 ,2 ,3},
                {3 ,5 ,5}
              }  

我想对索引 i 进行排序(比如 1)结果应该是

    A[3][3] = { {6 ,2 ,3},
                {1 ,4 ,7},
                {3 ,5 ,5}
              }  

排序大约 0 将导致

    A[3][3] = { {1 ,4 ,7},
                {3 ,5 ,5},
                {6 ,2 ,3}
              }  

如何使用排序功能来做到这一点?

4

4 回答 4

2

在 C 中:

来自stdlib.h的qsort对任意长度和任意元素大小的数组进行排序,以实现您想要的,我们需要向它提供这两条信息,长度是数,元素大小是数。

除了这些它需要知道如何比较元素之外,qsort还需要一个带有签名 int (*)(void *, void *) 的函数指针。这个函数是用指向每个元素的指针调用的,这将是每行中第一个数字的地址,现在我们只需要将选择的元素相互比较。qsort在A < B的情况下期望一个小于零的数字,对于A == B为零并且对于A > B大于零,这是通过从A中减去B来完成的。由于我们得到了指针,我们可以将它们转换为int * 并使用索引运算符来比较所需的位置。

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

const int sort_element = 1;// Choose a value from 0 to the column width

int intcmp( const void *a, const void *b ){
    const int *A = a;
    const int *B = b;
    return A[sort_element]-B[sort_element];
}
int main(){
    int a[3][3] = { 
        {1 ,4 ,7},
        {6 ,2 ,3},
        {3 ,5 ,5}
    };
    qsort( a, 3, sizeof(int)*3, intcmp);
}

如您所见,我们需要对每个要排序的元素使用一个比较函数。

于 2013-05-23T15:18:32.153 回答
1

如果您使用的是 C++11:

对列 ( col) 进行排序,如下所示:

int col = 1;
std::sort(A, A+3, [=](const int* a, const int* b)
{
    return a[col] < b[col];
});

如果您使用的是 C++(即在 C++11 之前):

为“less”操作定义一个仿函数类型,如下所示:

class column_less
{
    int col;
public:
    column_less(int col) : col(col) { }
    bool operator()(const int* a, const int* b) const
    {
        return a[col] < b[col];
    }
}

然后对列 ( col) 进行排序,如下所示:

int col = 1;
std::sort(A, A+3, column_less(col));

std::sort文件

于 2013-05-22T22:23:52.330 回答
0

试试qsort,我相信它在stdlib.h 中对指向每行第一个元素的指针进行排序。

于 2013-05-22T22:24:20.790 回答
0

让我们假设您的数据类型是uint32_t. 然后,您希望将此视为对sizeof(uint32_t) * number_of_columns. 当您调用比较函数时,您将传递给它这么大的项目。compare 函数查看其传递的内容(实际上是一行)中的适当元素,然后对行中的元素重新排序。

于 2013-05-22T22:24:28.893 回答