C ++:基于1行

时间:2017-01-07 20:06:55

标签: c++ arrays sorting

我有一个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]

编辑 :实际上我可以在排序后只使用索引。

2 个答案:

答案 0 :(得分:2)

首先,您的数组声明不正确(下面的示例代码显示了正确的声明)。

其次,我建议单独留下第一行,只对第二行索引进行排序。由于第二行用作索引器,因此无需对第一行进行排序。

第三,不建议在C ++中使用qsort

  1. qsort不是类型安全的。您必须使用void转换qsort指向要排序的类型的指针。如果执行错误,那么您的程序会出现运行时问题。
  2. qsort不能用于非POD类型(任何不兼容C的内容)。
  3. C ++编译器优化器在优化速度std::sort方面做得比qsort好得多。
  4. std::sort简单易用。
  5. 这是一个有效的例子:

    #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";
        }
    }
    

    Live Example

    std::sort适用于第二行,而非第一行。然后比较lambda根据第一行中的数据对第二行进行排序。

    输出循环显示如何在给定第二行的情况下索引第一行。例如,要在第一行中获取已排序的第三个数字:

    A[0][A[1][2]]

    由于A[1][2]是第三个排序数字的索引,因此第三个排序数字为A[0][A[1][2]]

    编辑:

    如果您尝试使用动态二维数组,请使用std::vectorthis example shows

答案 1 :(得分:-1)

我不知道目的,所以我可能错了,但也许你应该使用两个字段的结构或类:索引和数字,重载&lt;,&lt; =,==,&gt;,&gt ; =运算符和使用对象数组,只使用sort方法。