根据其他数组对数组进行排序

时间:2011-04-14 13:04:50

标签: c++ arrays sorting

我有一个包含两个元素数组的数组。现在我想将所有以零结尾的值(例如arr[3][0]arr[1][0])排序为从低到高排序。

然后我想将结束于1的值(例如arr[2][1]arr[1][1])也进行排序,但不按自己的顺序排序,但顺序与第一个数组相同。

以下是我的尝试:

int compareInts(const void* a, const void* b)
{
    return ( *(int*) a[0] - *(int*) b[0] );
}

int arr[4][2];

arr[0][0] = 50;
arr[0][1] = 0;

arr[1][0] = 40;
arr[1][1] = 1;

arr[2][0] = 50;
arr[2][1] = 2;

arr[3][0] = 85;
arr[3][1] = 3;

qsort( arr, 4, sizeof(int), compareInts );


我希望得到以下结果:

arr[0][0] = 40;
arr[0][1] = 1;

arr[1][0] = 50;
arr[1][1] = 0;

arr[2][0] = 50;
arr[2][1] = 2;

arr[3][0] = 85;
arr[3][1] = 3;

3 个答案:

答案 0 :(得分:2)

只需实现您自己的搜索算法(使用冒泡排序或您认为可能最有效的任何内容)并执行类似于以下伪代码的比较/交换:

if(a[i][0] > a[j][0])
{
    t[0] = a[i][0];
    t[1] = a[i][1];
    a[i][0] = a[j][0];
    a[i][1] = a[j][1];
    a[j][0] = t[0];
    a[j][1] = t[1];
}

如果你想基于多个列进行排序,你只需要重复这个比较其他子数组元素并首先排序最不重要的列。

编辑: 我应该可以使用qsort()。您只需相应地设置元素大小(在您的示例中应为2 * sizeof(int))。保持其余代码不变(虽然我不确定这个并且现在无法测试它)。

答案 1 :(得分:0)

一种方法:

using namespace std;
struct Compare
{
    bool operator()(const pair<int,int>& p1,
                    const pair<int,int>& p2)
    {
        return p1.first < p2.first;
    }
};

int main()
{
    int arr[4][2];

    arr[0][0] = 50;
    arr[0][1] = 0;

    arr[1][0] = 40;
    arr[1][1] = 1;

    arr[2][0] = 50;
    arr[2][1] = 2;

    arr[3][0] = 85;
    arr[3][1] = 3;

    //Create a vector of pairs
    vector<pair<int,int> > pairs;
    for(int  i = 0; i < 4; ++i)
    {
        pairs.push_back(make_pair(arr[i][0], arr[i][1]));
    }

    //Sort the vector on the first element using the functor
    stable_sort(pairs.begin(), pairs.end(), Compare());

    //Copy the result back
    for(size_t idx = 0; idx < pairs.size(); ++idx)
    {
        arr[idx][0] = pairs[idx].first;
        arr[idx][1] = pairs[idx].second;
    }
    return 0;
}

答案 2 :(得分:0)

您是否必须拥有int[][]类型的数组?如果没有,你可以做类似下面的事情(或多或少像阿莎回答的那样,当他的答案出现时我已经打字了。)

#include <algorithm>
#include <utility>

struct cmpTwoIntsPair
{
  bool operator() (pair<int, int> const & lhs, pair<int, int> const & rhs)
  {
    return lhs.first < rhs.first;
  }
}

typedef std::pair<int, int> twoInts;

unsigned int arrSize = 5;
twoInts arr[arrSize];

... Insert values here ...

std::sort(arr, arr + arrSize, cmpTwoIntsPair);