根据一些标准对索引子集进行排序

时间:2019-09-27 15:50:02

标签: c++ algorithm sorting stl

考虑

  • 前n个自然数的向量,I,I = [0,1,... n-1],n <= 32。
  • 另一个自然向量S,S [i] <= 2000,对于任何i = 0..n-1,不一定是唯一的
  • 具有m个元素的I的子集,J,0 <= J [j]

是否有一种有效的方式(就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的事实?

1 个答案:

答案 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