C++ 根据其他数组对数组进行排序
我有一个包含两个元素的数组。现在我想对所有以零结尾的值(例如,C++ 根据其他数组对数组进行排序,c++,arrays,sorting,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
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;
只需实现您自己的搜索算法(使用气泡排序或任何您认为最有效的方法),并执行类似于以下伪代码的比较/交换:
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];
}
如果您想基于多个collumn进行排序,您只需重复此操作,比较其他子数组元素并首先对最不重要的列进行排序
编辑:
我认为使用qsort()也可以做到这一点。您只需相应地设置元素大小(在您的示例中应为2*sizeof(int)
)。保持代码的其余部分不变(尽管我不确定这一点,现在无法测试运行它)。一种方法:
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;
}
使用名称空间std;
结构比较
{
布尔运算符()(常量对和p1,
常量对(p2)
{
返回p1.first
是否必须具有类型为int[][]的数组
?如果没有,你可以做如下的事情(或多或少像Asha回答的那样,当他的答案出现时我已经在打字了)
#包括
#包括
结构cmpTwoIntsPair
{
布尔运算符()
{
返回lhs.first
谢谢!!我只需将此项更改:sizeof(int)
为2*sizeof(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);