我有一个包含两个元素数组的数组。现在我想将所有以零结尾的值(例如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;
答案 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);