与排序相关的算法(在排序的集合中用其索引替换每个项目)

时间:2013-10-17 16:29:20

标签: c++ algorithm sorting stl

我需要做以下事情:

给定std::vector int我需要将每个int替换为向量排序时的索引。

我会尝试用一个例子来解释它。

输入:{22, 149,31}

输出:{2, 0, 1}

(请注意,在排序后的矢量{149,31,22}中, 22 位于已排序矢量的索引2 中, 149 索引0 31 索引1

我希望我能清楚算法。

这是以某种方式在STL C ++ 11库中实现的吗?这个算法有名吗?你能提供任何想法来优雅地实现它吗?

1 个答案:

答案 0 :(得分:13)

我认为它没有名字,但它很容易实现。

首先,创建一个目标矢量并用索引0 ... n。

填充它
vector<int> indices(input.size());
std::iota(indices.begin(), indices.end(), 0);

其次,您对该向量进行排序,但不是比较向量中的数字,而是比较输入向量中相关索引处的数字。

std::sort(indices.begin(), indices.end(),
          [&input](int l, int r) { return input[l] < input[r]; });

编辑请注意,我按升序排序,而您正在寻找降序排列。只需在lambda中翻转比较。