有一个整数数组,有一个数字M. 数组需要按照以下标准排序:
(arr[i] % M, arr[i] / M)
也就是说,排序是根据arr[i] % M
的结果确定的,如果是平局,则根据arr[i] / M
的结果确定。
我知道可以像这样传递自定义比较器:
std::sort(arr, arr + n, comp) // comp is a custom comparator.
但如果我简单地应用sort
两次,答案可能就不对了。
我们可以使用std::sort()
来实现此功能吗?
答案 0 :(得分:4)
简单地:
auto proj = [&](int e) { return std::make_tuple(e % M, e / M) };
std::sort(std::begin(arr),
std::begin(arr) + n,
[&](int lhs, int rhs) { return proj(lhs) < proj(rhs); });
答案 1 :(得分:1)
您希望按arr[i]%m
排序值,如果两个值相等,则您希望按arr[i]/m
排序。
bool cmp(int a,int b)
{
if(a%m < b%m)
return true;
if(a%m > b%m)
return false;
return a/m < b/m;
}
有关工作示例,请参阅here。
答案 2 :(得分:-1)
对arr[i]%M
和arr[i]/M
现在以sort(arr,arr+n)
的升序顺序调用arr[i]%M
,如果arr[i]%M
与arr[i]/M
相等。如果你想要一个不同的排序写一个函数并调用类似sort(arr,arr+n,func)
的排序。
也看到这个。
http://www.cplusplus.com/reference/algorithm/sort/
http://www.cplusplus.com/reference/utility/pair/
vector<pair<int,int> > v;
for(int i = 0;i < n;i++){
v.push_back(a[i]%m,a[i]);
}
sort(v.begin(),v.end());
此处按a[i]
排序相当于按a[i]/n
排序,您可以按v[i].second
获取第二个元素。