如何根据c / c中的特定索引对2D数组进行排序?

时间:2013-05-22 22:12:57

标签: c++ c

假设我们有一个2D数组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 个答案:

答案 0 :(得分: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);
}

如您所见,我们需要为每个元素分配一个比较函数。

答案 1 :(得分: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 documentation

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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