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。若是排序的元素的总个数比较少,那么选择任意一种均可以。内存

相关文章
相关标签/搜索