假设我们有一个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函数执行此操作?
答案 0 :(得分:2)
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)
对列(col
)进行排序,如下所示:
int col = 1;
std::sort(A, A+3, [=](const int* a, const int* b)
{
return a[col] < b[col];
});
为“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));
答案 2 :(得分:0)
尝试使用qsort,我相信它是在stdlib.h中对指向每行中第一个元素的指针进行排序。
答案 3 :(得分:0)
让我们假设您的数据类型为uint32_t
。然后,您希望将其视为sizeof(uint32_t) * number_of_columns
的排序项。当你调用比较函数时,你将传递这么大的项目。 compare函数查看其传递的相应元素(实际上是一行),然后重新排序行中的元素。