我有一个2行的2D数组,它有很大的数字(最多10 ^ 9)。 我正在尝试基于 0th 行对数组进行排序。
例如:我有一个数组:A[5][2]={{1,0},{3,1},{2,2},{6,3},{5,4}}
,其中第二行是元素的索引。
现在我想要保留原始索引对数组进行排序。
排序后A应该是:
A[5][2]={{1,0},{2,2},{3,1},{5,4},{6,3}}
我做了以下事情:
long long a[n+1][2];
for (long long i = 0; i < n; i++)
{
cin>>a[i][0];
a[i][1]=i;
}
qsort(a, n, sizeof a[0], compare);
比较功能是:
int compare ( const void *pa,const void *pb )
{
int *a = (int*)pa;
int *b = (int*)pb;
if(a[0] == b[0])
return a[1] - b[1];
else
return a[0] - b[0];
}
它适用于较小的数字值。对于较大的值,我收到运行时错误(SIGSEGV)。
有人可以帮助纠正错误吗?或者有更有效的方法吗?
注意 :我在比较功能中尝试了很长时间,但它给出了转换错误。
error: invalid conversion from 'll (*)(const void*, const void*) {aka long long int (*)(const void*, const void*)}' to '__compar_fn_t {aka int (*)(const void*, const void*)}' [-fpermissive]
编辑 :实际上我可以在排序后只使用索引。
答案 0 :(得分:2)
首先,您的数组声明不正确(下面的示例代码显示了正确的声明)。
其次,我建议单独留下第一行,只对第二行索引进行排序。由于第二行用作索引器,因此无需对第一行进行排序。
第三,不建议在C ++中使用qsort
。
qsort
不是类型安全的。您必须使用void
转换qsort
指向要排序的类型的指针。如果执行错误,那么您的程序会出现运行时问题。qsort
不能用于非POD类型(任何不兼容C
的内容)。 std::sort
方面做得比qsort好得多。std::sort
简单易用。这是一个有效的例子:
#include <algorithm>
#include <iostream>
int main()
{
int A[2][5] = { {1,3,2,6,5},{0,1,2,3,4} };
// sort the index row, not the "data" row
std::sort(A[1], A[1] + 5,
[&](int n1, int n2){ return A[0][n1] < A[0][n2]; });
// output results
for (int i = 0; i < 2; ++i)
{
for (int j = 0; j < 5; ++j)
{
if (i == 0) // if this is a data row
std::cout << A[i][A[1][j]] << " ";
else // this is an index row
std::cout << A[i][j] << " ";
}
std::cout << "\n";
}
}
std::sort
适用于第二行,而非第一行。然后比较lambda根据第一行中的数据对第二行进行排序。
输出循环显示如何在给定第二行的情况下索引第一行。例如,要在第一行中获取已排序的第三个数字:
A[0][A[1][2]]
由于A[1][2]
是第三个排序数字的索引,因此第三个排序数字为A[0][A[1][2]]
编辑:
如果您尝试使用动态二维数组,请使用std::vector
,this example shows
答案 1 :(得分:-1)
我不知道目的,所以我可能错了,但也许你应该使用两个字段的结构或类:索引和数字,重载&lt;,&lt; =,==,&gt;,&gt ; =运算符和使用对象数组,只使用sort方法。