考虑
是否有一种有效的方式(就CPU周期/缓存友好性/内存而言)来根据S(J)对J的元素进行排序?
首选使用标准算法的C ++代码。
示例:
I = [0, 1, 2, 3, 4]
S = [10, 50, 40, 20, 30]
J = [1, 3, 4]
S(J) = [50, 20, 30]
J sorted according to S(J) = [3, 4, 1]
我已经考虑过使用std :: multimap进行“免费”排序,但是std :: multimap背后的机制(分配等)似乎很昂贵。
使用std :: pair绑定J和S(J)将允许使用std :: sort。缺点是需要额外的内存和额外的循环才能获得最终排序的J。
我的目的是在手写排序例程中使用S(J)作为标准同时对J和S(J)进行排序。但是,在2019年编写排序函数似乎很尴尬。
这是一种聪明的方法吗?是否有可能利用n <= 32的事实?
答案 0 :(得分:3)
我的目的是在手写排序例程中使用S(J)作为标准同时对J和S(J)进行排序。但是,在2019年编写排序函数似乎很尴尬。
您处在正确的轨道上,但无需编写自己的排序。您可以利用lambda来获得所需的自定义排序行为,同时仍使用std::sort
为您对数组进行排序。您要做的就是获取提供给lambda的值,并将它们用作S
的索引,然后比较这些结果。那会给你像这样的代码
int main()
{
int S[] = {10, 50, 40, 20, 30};
int J[] = {1, 3, 4};
std::sort(std::begin(J), std::end(J),[&S](auto lhs, auto rhs){ return S[lhs] < S[rhs]; });
for (auto e : J)
{
std::cout << e << " ";
}
}
哪个输出
3 4 1