在向量中对一个元素进行排序的最有效方法?

时间:2016-03-20 14:42:38

标签: c++ sorting

我有一个元素向量,它们根据一些外部值进行排序。它是一个大容器,查找排序值相对昂贵。在某些时候,需要重新排序一个元素(仅)。重新排序该元素的最有效方法是什么? std::sort()向量?擦除 - 插入元素?将元素与其直接邻居进行比较?

编辑:澄清一下,通过擦除 - 插入元素我的意思是这样的:

// erase the key and then insert-sort it
auto iter = std::find(keys.begin(), keys.end(), key);

keys.erase(iter);
SortedInsert(keys, index, <cmp>);

EDIT2:出于其他性能原因,容器需要是一个向量

4 个答案:

答案 0 :(得分:1)

您可以使用以下内容:

std::sort(myvector.begin(), myvector.end)

认为s part of STL and it已经很好地实施了。

答案 1 :(得分:1)

如果要在排序向量中的正确位置插入元素,则应使用upper_bound获取迭代器并将其传递给insert以将元素放在正确的位置:

vec.insert(std::upper_bound(vec.begin(), vec.end(), item), item);

请注意,upper_bound会很快(O(log n)),但插入速度可能很慢(O(n)),因为它必须移动插入点之后的所有元素。

然而,在向量的末尾插入并调用std::sortO(n log n)所以它是最糟糕的,至少在大向量上!

vec.insert(item);
std::sort(vec.begin(), vec.end());

另一个选项可能是在向量的末尾插入,然后使用前一个元素移动,直到它更低或相等。在这种情况下,插入是分摊O(1),您必须进行O(n)交换。

我担心没有像O(log n)那样的list解决方案。

答案 2 :(得分:0)

考虑将值存储在MAP中。

答案 3 :(得分:0)

您可以查看101010的答案。我认为这是非常明确的解释。您可以根据案例进行分析。