簡體   English   中英

對向量中的一個元素進行排序的最有效方法?

[英]Most efficient way to sort one element in a vector?

我有一個向量元素,這些元素根據一些外部值進行排序。 它是一個大容器,查找分類值相對昂貴。 在某個時候,一個元素(僅)需要重新排序。 重新排序該元素的最有效方法是什么? 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:由於其他性能原因,容器需要成為向量

您可以使用如下形式:

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

認為它s part of STL and it並且實施良好。

如果要在排序向量中的正確位置直接插入元素,則應使用upper_bound獲取一個迭代器,並將其傳遞以insert元素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)解決方案。

考慮將值存儲在MAP中。

您可以檢查101010的答案。 我認為這很有解釋性。 您可以根據自己的情況進行分析。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM