STL vector+sort排序和multiset/multimap排序比較

本文由 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。若是排序的元素的總個數比較少,那麼選擇任意一種均可以。內存

相關文章
相關標籤/搜索