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

Most efficient way to sort one element in a vector?

本文关键字:排序 有效 元素 方法 向量 一个      更新时间:2023-10-16

我有一个元素向量,这些元素根据一些外部值进行排序。它是一个大容器,查找排序值相对昂贵。在某些时候,一个元素(仅)需要重新排序。重新排序该元素的最有效方法是什么? 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:出于其他性能原因,容器需要成为矢量

如果要

将元素直接插入排序向量中的正确位置,则应使用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)掉期。

恐怕不会有像list那样O(log n)解决方案.

你可以使用这样的东西:

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

认为它s part of STL and it实施得很好。

考虑将值存储在 MAP 中。

您可以查看 101010 的答案。我认为这是非常解释性的。你可以用你的案例来分析这一点。