我编写了一个简单的C++代码来检查数据排序的速度,以列表形式然后以 vector 形式表示。

对于列表,我得到的时间为27秒。对于 vector ,我得到10秒。为什么会有巨大的性能差距?用于对列表和 vector 进行排序的算法不一样吗?即mergesort?

编辑:我在最后一点上可能是错误的。据我所知,教科书从理论上讲解排序算法时,似乎是从list的角度使用std::vector这个词。我不知道
vector 的排序算法与列表的排序算法有何不同,因此,如果有人可以澄清这一点真的很有帮助。谢谢。

 //In this code we compare the sorting times for lists and vectors.
//Both contain a sequence of structs

#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
#include <time.h>
#include <math.h>
#include <stdlib.h>
#include <iomanip>
using namespace std;


struct particle
{
  double x;
  double y;
  double z;
  double w;

    bool operator<(const particle& a) const
    {
        return x < a.x;
    }

};


int main(int argc, char *argv[])
{
  int N=20000000;
  clock_t start,stop;

  vector<particle> myvec(N);
  vector<particle>::iterator cii;
  //Set vector values
  for (cii = myvec.begin(); cii != myvec.end(); ++cii)
  {
    cii->x =1.0*rand()/RAND_MAX;
    cii->y =1.0*rand()/RAND_MAX;
    cii->z =1.0*rand()/RAND_MAX;
    cii->w =1.0*rand()/RAND_MAX;
 }


  list<particle> mylist(N);
  list<particle>::iterator dii;

   //Set list values
  for (cii=myvec.begin(),dii = mylist.begin(); dii != mylist.end() && cii!=myvec.end(); ++dii, ++cii)
  {
      dii->x =cii->x;
      dii->y =cii->y;
          dii->z =cii->z;
      dii->w =cii->w;
 }


  //Sort the vector

  start=clock();
  sort(myvec.begin(),myvec.end());
  stop=clock();
  cout<<"Time for sorting vector "<<(stop-start)/(double) CLOCKS_PER_SEC<<endl;



  //Sort the list
  start=clock();
  mylist.sort();
  stop=clock();
  cout<<"Time for sorting list "<<(stop-start)/(double) CLOCKS_PER_SEC<<endl;



  return 0;
}

最佳答案

没有使用合并排序对std::vector进行排序(在大多数实现中;标准未指定算法)。
std::list没有O(1)随机访问权限,因此它不能使用像Quick sort *这样的算法,该算法要求O(1)随机访问要快(这也是std::sortstd::list上不起作用的原因)。

这样,您将必须使用转发迭代就足够的算法,例如Merge sort **。

合并排序通常较慢[1] [2]

另请参阅:what's the difference between list.sort and std::sort?

*:libstdc++实际上使用了introsort。
**:libstdc++实际上使用a variant of merge sort

07-24 09:46
查看更多