在解决竞争性编码问题时,我遇到了以下排序方案 我有一个以下结构的载体
struct Data{
int p;
int val;
int ll;
};
定义为:
vector<Data> a(N);
现在结构中的p字段告诉val所属的设定编号
例如,如果值为1 2 3 4 5 6 7 8 9
(1,4,7)属于组/组3,即p为3,(2,5,8)属于组/组4,即p为4,(3,6,9)属于组/组5即p是5
我的结构为p和val字段为
p为3 4 5 3 4 5 3 4 5
val为1 2 3 4 5 6 7 8 9
现在问题是我必须按降序对矢量集进行排序 即7 8 9 4 5 6 1 2 3 这里1 4和7属于第3组,因此它们按各自的位置排序。
我尝试使用下面的选择排序,但是由于O(N ^ 2)的复杂性,它超出了时间限制。
for(int i=0;i<N;i++)
{
int mi=i;
Data max=a[i];
for(int j=i+1;j<N;j++)
{
if((a[i].p==a[j].p)&&(a[j].val>max.val))
{
max=a[j];
mi=j;
}
}
a[mi]=a[i];
a[i]=max;
}
请帮助我找到排序此方案的最佳(时间复杂度)方法(如果可能,使用STL排序)。 提前谢谢。
答案 0 :(得分:0)
修改http://www.cplusplus.com/reference/algorithm/sort/,关键位是:
<div>test</div>
请注意,在#include <algorithm>
...
bool mycomparison (Data i, Data j) {
if (i.p != j.p)
return j.p < i.p;
else
return j.val < i.val;
}
...
// Sort vector a
a.std::sort( a.begin(), a.end(), mycomparison );
...
行中撤消i
和j
会导致事情按降序排列。