簡體   English   中英

c ++矢量排序

[英]c++ vector sorting

這是關於使用STL std :: sort函數進行排序的機制的一般性問題。 我讀過一些關於排序的帖子,一般來說,排序向量比排序鏈表更快。 這對於矢量和結構/對象的鏈表是否正確? 對於結構的鏈接列表,我覺得只需修改索引就可以輕松實現排序。 另一方面,向量的排序似乎涉及物理地切換結構/對象的數據的數據位置,因為它們是連續的(這是真的嗎?)。 在這種情況下,似乎排序鏈表會更快。

編輯!!!:現在有了圖片:

在此輸入圖像描述

所以我想問題是更好的措辭:哪個更快排序對象,排序鏈表或矢量(雖然這可能取決於對象的大小)? 此外,是否按照3)所示完成了鏈接列表的排序,並且對於完成如2)所示的向量進行了排序?

list排序是專門的(即list具有函數排序,不能使用std::sort )。

void sort();
template <class Compare> void sort(Compare comp);

復雜性:大約N log(N)比較,其中N == size()。

std::sort in generalized。

template<class RandomAccessIterator>
void sort(RandomAccessIterator first, RandomAccessIterator last);
template<class RandomAccessIterator, class Compare>
void sort(RandomAccessIterator first, RandomAccessIterator last,
Compare comp);

復雜性:O(N log(N))(其中N == last - first)比較。

請注意, std::list::sort的結果與std::stable_sort相同。 請注意,標准中沒有信息,應該如何實現sort 它是實現定義的。

您總是可以通過排序索引或指針的並行集合或其他任何方式進行排序。 這適用於列表和向量。

排序列表較慢的原因是最快的排序算法需要隨機訪問,即能夠立即獲取給定索引處的值的能力。 你沒有得到列表。 要獲得鏈接列表中的第10個項目(比如說),您必須從頭開始並向前移動10次。

你是對的,如果復制一個元素很慢,一種std::vector會很慢。 C ++ 11引入了可能有幫助的移動語義,可以移動元素而不是復制元素。

鏈接列表很容易使用合並排序進行排序,其中O(n log n)與任何其他良好排序算法相同。 不同之處在於開銷。

如果結果對您很重要,那么始終對您的特定情況進行基准測試是一個好主意。

暫無
暫無

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

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