如何在c/c++中按特定索引对2D数组进行排序?

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

如何使用sort函数来实现此操作?
4个回答

2

在C语言中:

stdlib.h库中的qsort函数可以对任意长度和任意元素大小的数组进行排序。为了达到您想要的效果,我们需要提供两个信息:长度是行数,元素大小是列数

除此之外,它还需要知道如何比较元素。qsort需要一个函数指针,其签名为int (*)(void *, void *)。该函数被调用时会传递指向每个元素的指针,这些指针将是每行中第一个数字的地址,现在我们只需要将选择的元素与其他元素进行比较即可。qsort期望在A < B的情况下返回小于零的数字,在A == B的情况下返回零,在A > B的情况下返回大于零的数字,这可以通过将BA中减去来实现。由于我们得到了指针,我们可以将它们转换为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);
}

正如您所见,我们需要为每个要排序的元素编写一个比较函数。

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 文档


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

0
假设您的数据类型是uint32_t。然后,您希望将其视为排序sizeof(uint32_t) * number_of_columns个项目。当您调用比较函数时,您将传递这些大项目。比较函数查看其传递的内容中的适当元素(实际上是一行),然后重新排列行内的元素。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接