用vector实现对10W个随机数进行插入排序为什么这么慢?

datoubaicai 2008-10-18 02:03:10
在visual studio 2008下编译速度巨慢,要300多秒
而用intel c++ compiler编译就快了很多倍,只需要10秒左右
另外改成用数组实现也要快很多,不到20秒
请高手指点一下是什么原因?按道理说用数组和用vector,时间差距不应 该这么大啊
一开始以为是vector要做越界检查的原因,在程序开头加了#define _SECURE_SCL 0还是很慢

下面是源代码:

#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <vector>
#include <string>

int main()
{
int vectorSize;
cout<<"Please enter the size of vector: ";
cin>>vectorSize;
cout<<endl;

vector<float> v1; //the vectors to store the numbers to be sorted

srand(time(NULL)); // to generate differnt numbers for sort each time

//Initialize the vector v
for(int i=0;i<vectorSize;i++)
{
float rNum; //random number
rNum=(float)rand()/RAND_MAX; //generate random numbers
v1.push_back(rNum); //insert rNum into the vector v1
}
clock_t start,end; //starting time and ending time

start=clock();
insertionSort(v1);
end=clock();
cout<<float) (end-start)/ CLOCKS_PER_SEC <<" secs"<<endl;
return 0;
}

void insertionSort(vector<float>& v)
{
float temp;
for(int i=1;i< v.size();i++)
{
//v[0...i-1] is a sorted subarray
//find a correct postion for v[i] and insert v[i] to it
int j=i;
temp=v[i];
while(j>0&&temp<v[j-1])
{ //move the numbers that are greater than v[i]
v[j]=v[j-1];
j--;
}
v[j]=temp; //find the right postion and assign v[i] to it
}
}
...全文
388 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
yixiao386 2009-08-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 feature_aza 的回复:]
对于大量的数而言,要存在vector容器里面,每次的插入操作很花时间,放在数组肯定是会快很多的!
还有map也会很花时间的
[/Quote]
同意
LeiSanJin 2009-08-07
  • 打赏
  • 举报
回复
楼上似得道之人啊!
yshuise 2009-08-03
  • 打赏
  • 举报
回复
优化,差不多。
xwsn007 2009-08-03
  • 打赏
  • 举报
回复
void reserve(size_type n);
灌水九段 2009-08-03
  • 打赏
  • 举报
回复
v1.reserve(10000)
原来还有这么一手。。
想想自己以前的用法,罪过罪过
windsting 2009-08-03
  • 打赏
  • 举报
回复
你找一只乌龟,怎么训练都不可能让它在赛马比赛中夺冠...
这就是为什么大家都让你用map(实际上应该用set)

你把一匹好马马的四条腿捆在一起,也不可能夺冠...
这就是为什么你的vector比数组慢这么多(实际上差异应该不超过100%)。

工欲善其事,怎么也要先了解自己的器吧。
gunsand 2009-08-03
  • 打赏
  • 举报
回复
排序用VECTOR》还这么大的数?
zhusizhi007 2009-08-03
  • 打赏
  • 举报
回复
用vector的reserve可以省去内存分配的时间
BuleRiver 2009-08-02
  • 打赏
  • 举报
回复
这个程序浪费时间关键是浪费在这里了:
v1.push_back(rNum); //insert rNum into the vector v1
因为根据vector的缓冲策略(可以分析其源代码),如果开始没有元素,那么缓冲区的长度是0,当插入一个元素的时候,要开辟缓冲区,它的size是1,但是,实际上缓冲区的长度是2,当插入第二个元素的时候,直接插在第一个后面就可以了,但是当插入第三个元素的时候,发现缓冲区不够用了,这时候就需要重新开辟一个比较大的缓冲区,把原来的缓冲区销毁,第二次开辟的缓冲区的大小是6(3*2=6),当时当插入第七个元素的时候,又不够用了,要重新开辟,如此反复,很浪费时间。为了解决这个问题,可以一开始就指定开辟的缓冲区的大小,有两种方法:
第一种是初始化的:v1.resize(10000);或者开始的时候用v1.assign方法,但是在插入元素的时候就不能用v1.push_back了。
第二种是未初始化方法:v1.reserve(10000);这个时候,还要用v1.push_back。
crst_zh 2009-08-02
  • 打赏
  • 举报
回复
结贴率0是怎么来的?第一次发贴问?
老邓 2009-08-02
  • 打赏
  • 举报
回复
随机插入用list
crst_zh 2009-08-02
  • 打赏
  • 举报
回复
因为你这个vecotor一直在增长,当满了的时候,总是要申请一块新的空间,来回搬运,清除......
应该在最初就保留一个比较大的空间,使用reserve()
mstlq 2009-08-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mars_man 的回复:]
如果你先用 vector::reserve 函数就不会这么说了
[/Quote]

正解^_^
FEATURE_AZA 2009-08-02
  • 打赏
  • 举报
回复
对于大量的数而言,要存在vector容器里面,每次的插入操作很花时间,放在数组肯定是会快很多的!
还有map也会很花时间的
P_ghost 2008-10-18
  • 打赏
  • 举报
回复
vector也是有容量的,超过容量会重新分配,这是个巨大开销。
frp529 2008-10-18
  • 打赏
  • 举报
回复
vector如果进行排序效率是很低的
用map效率最高
mars_man 2008-10-18
  • 打赏
  • 举报
回复
如果你先用 vector::reserve 函数就不会这么说了
datoubaicai 2008-10-18
  • 打赏
  • 举报
回复
数组也是连续的啊,为什么比vector快
小大小丑 2008-10-18
  • 打赏
  • 举报
回复
用vector 肯定慢了 它是空间连续的, 尝试一下list

64,631

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧