本文由 www.169it.com 蒐集整理html
在C++的STL庫中,要實現排序能夠經過將全部元素保存到vector中,而後經過sort算法來排序,也能夠經過multimap實如今插入元素的時候進行排序。在經過vector+sort進行排序時,全部元素須要先存入vector容器中,sort在排序時又須要將元素所有取出來再進行排序。multimap底層實現爲紅黑樹,所以元素在插入的過程當中就實現了排序。那麼到底哪種排序速度更快呢?算法
下面有一個測試程序:測試
if
(gettimeofday(&tv, NULL) != 0)
return
0.0;
return
tv.tv_sec + tv.tv_usec / 1000000.0;
}
struct
Score {
string name;
double
score;
bool
operator <(
const
Score& right)
const
{
return
score < right.score;
}
};
int
main(
int
argc,
char
** argv) {
vector<Score> src;
for
(
int
i = 0; i < 10000000; i++) {
int
num =
rand
();
char
buf[32];
sprintf
(buf,
"%d"
, num);
Score score = { buf, num };
src.push_back(score);
}
{
double
stime =
time
();
vector<Score> res;
for
(vector<Score>::const_iterator it = src.begin();
it != src.end(); ++it) {
res.push_back(*it);
}
sort(res.begin(), res.end());
double
etime =
time
();
printf
(
"vector: %f\n"
, etime - stime);
}
{
double
stime =
time
();
multiset<Score> res;
for
(vector<Score>::const_iterator it = src.begin();
it != src.end(); ++it) {
res.insert(*it);
}
double
etime =
time
();
printf
(
"multiset: %f\n"
, etime - stime);
}
return
0;
}
|
程序運行結果爲:spa
1
2
3
|
time
vector 4.776060
multiset 10.761023
|
在這個測試中,vector+sort排序比multiset(multimap實現基於multiset)快多了。快速排序是目前已知的全部排序算法中最快的排序算法,所以它比基於堆排序的multiset快。code
在這個測試結果出來以前,大多數人都會毫無疑問地認爲multiset排序要更快。這也是有緣由的,快速排序速度雖然快,可是在實際的運行過程當中,它須要大量地拷貝元素,其拷貝操做的時間複雜度爲o(NlogN),而基於紅黑樹的multiset在排序的過程當中則避免了元素的拷貝。若是元素的內存佔用空間比較大,那麼multiset排序的速度將比vector+sort快。爲了測試這個結果,將上面測試程序中的結構體改成:orm
1
2
3
4
5
6
7
8
9
10
|
struct
Score {
string name1;
string name2;
string name3;
string name4;
double
score;
bool
operator <(
const
Score& right)
const
{
return
score < right.score;
}
};
|
而後從新編譯運行測試程序,測試結果爲:htm
1
2
3
|
time
vector 12.955739
multiset 11.368364
|
這個測試結果和咱們的預期一致。排序
總之,咱們在使用STL的排序算法時,須要根據不一樣的元素構造來進行合適的選擇,若是都是比較簡單的元素,那麼適合選擇vector+sort來進行排序,對於由字符串構成的佔用了比較大的空間的複雜元素,應該使用multiset。若是排序的元素的總個數比較少,那麼選擇任意一種均可以。內存