由 www.169it.com 蒐集整理html
在C++的STL庫中,要實現排序能夠經過將全部元素保存到vector中,而後經過sort算法來排序,也能夠經過multimap實如今插入元素的時候進行排序。在經過vector+sort進行排序時,全部元素須要先存入vector容器中,sort在排序時又須要將元素所有取出來再進行排序。multimap底層實現爲紅黑樹,所以元素在插入的過程當中就實現了排序。那麼到底哪種排序速度更快呢?算法
下面有一個測試程序:測試
1spa 2code 3htm 4排序 5內存 6ci 7字符串 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
|
程序運行結果爲:
1 2 3 |
|
在這個測試中,vector+sort排序比multiset(multimap實現基於multiset)快多了。快速排序是目前已知的全部排序算法中最快的排序算法,所以它比基於堆排序的multiset快。
在這個測試結果出來以前,大多數人都會毫無疑問地認爲multiset排序要更快。這也是有緣由的,快速排序速度雖然快,可是在實際的運行過程當中,它須要大量地拷貝元素,其拷貝操做的時間複雜度爲o(NlogN),而基於紅黑樹的multiset在排序的過程當中則避免了元素的拷貝。若是元素的內存佔用空間比較大,那麼multiset排序的速度將比vector+sort快。爲了測試這個結果,將上面測試程序中的結構體改成:
1 2 3 4 5 6 7 8 9 10 |
|
而後從新編譯運行測試程序,測試結果爲:
1 2 3 |
|
這個測試結果和咱們的預期一致。
總之,咱們在使用STL的排序算法時,須要根據不一樣的元素構造來進行合適的選擇,若是都是比較簡單的元素,那麼適合選擇vector+sort來進行排序,對於由字符串構成的佔用了比較大的空間的複雜元素,應該使用multiset。若是排序的元素的總個數比較少,那麼選擇任意一種均可以。