1樓:MashPlant
std::sort對於日常使用的情形可以說是做到了很好,但是感覺也沒有必要盲目吹捧,畢竟它的演算法總體來說並沒有超出常規的認知範圍。
對於特定的應用,std::sort不一定是最快的選擇,甚至std::stable_sort都可能直接比它要快,這是由快排和歸併這兩種演算法的特性決定的,從比較次數來看,快排的最好情形=歸併的最壞情形,所以如果比較操作非常昂貴,可以考慮std::
stable_sort,比如這個例子
#include
#include
#include
#include
namespace chrono = std::chrono;
struct Int
用g++ O3編譯,在我的機器上,sort耗時3.07894s,stable_sort耗時2.32972s
當然這個例子可能過於極端了,而且其實意義也不太大。
更加平常的例子是,單純的想排序整數,這時基數排序是否是乙個更好的選擇呢?這取決與記憶體和時間的權衡,stl不能為你做這種選擇,必須根據自己的應用場景來做。
2樓:lalala
STL的qsort在partition,遞迴,第一深度方面都做了優化。小資料下自己寫和用STL基本沒有區別。但是資料量一大,STL的優勢就顯示出來了。
3樓:
STL的sort必然要比你自己寫的快排要快,因為你自己手寫乙個這麼複雜的sort,那就太閒了。STL的sort是盡量讓複雜度維持在O(N log N)的,因此就有了各種的Hybrid sort algorithm。
題主你提到的先quicksort到一定深度之後就轉為heapsort,這種是introsort。
每種STL實現使用的演算法各有不同,GNU Standard C++ Library的實現就是先introsort,然後再來個insertion sort。
References:
sort (C++)
Introsort
libstdc++: Sorting Algorithms
linux 核心的list和STL的list的區別是什麼?兩個的效率哪個更高?
吳詠煒 本質上,std list 幫你做的事情就是把你的物件加上前後向指標存放到容器裡,幫你做生命週期管理。如果你的結點就只存在於乙個鍊錶之中,兩者的效率沒有任何區別,且 std list 使用起來更加方便。std list 的優點在於,標準庫幫你維護物件的生命週期,而且你自己不需要維護前向和後向指...
你是如何寫快排的?
問題背景調查員 快速排序。void QuickSort vector nums,int left,int end if nums L nums end swap nums L nums end QuickSort nums,left,L QuickSort nums,L 1,end 沒有精確劃分邊界...
關於C 菱形繼承關係和STL出現的問題?
暮無井見鈴 問題來自 C 標準中乙個令人不舒服的地方 Move assignment operator n4659 15.8.2,12.3 It is unspecified whether subobjects representing virtual base classes are assig...