重看数据结构,写了个冒泡排序,差距很大,求解!!!

lghe001 2011-10-29 03:06:53
#include <time.h>
#include <stdio.h>
//N超过65532之后排序时间从0变成9秒
#define N 65535
int *p = new int[N];

int main()
{
time_t t0,t1,t2;

time(&t0);

unsigned i = 0;
//把数组按下标从小到大顺序赋值,即数组中前面的小于后面
do
{
p[i] = i;
++i;
} while (i < N);

time(&t1);

double cost = difftime(t1, t0);
printf("%f\n",cost);

bool chang = true;
for (unsigned i = N; i >= 1 && chang; --i)
{
chang = false;

for (unsigned j = 0; j < i; ++j)
if(p[j] > p[j+1]) //判断是否前面小于后面 ‘<’,前面小于后面 ‘>’
{
int temp = p[j];
p[j] = p[j+1];
p[j+1] = temp;

chang = true;
}
}

time(&t2);
cost = difftime(t2, t1);
printf("%f\n",cost);

return 0;
}


用release版本编译!很简单的代码,先弄出个大数组,然后把数组按小标顺序赋值,完了之后数组变成了从小到大有序。下面的就是“按从小到大”和“从大到小”的冒泡排序了。现在疑惑的就是有3点:

1,if里用“>”号,程序是按“从小到大”排序,而本来就已经是符合了。把define宏里的N设为65532(含)一下,则程序立马执行完,第二个printf语句输出的是0秒。否则,比如把N设为65533,程序就会执行很久,第二个printf语句输出的是9秒。N设为65533应该没有溢出啊,就是是溢出,溢出结果按unsigned来解释还是在65535以内啊,为啥差距这么大?debug版本没这怪异问题

2,if里用“>”号,N设为65532.那么if语句体里的语句不会被执行,但是每次都要执行if括号里的条件吧,要比较那么多次条件,那为什么第二个printf语句输出的是0秒?

3,不管把N设为多少,第一个printf语句输出的都是0秒,难道那么多个元素赋值都一点时间不花?
...全文
132 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lghe001 2011-10-29
  • 打赏
  • 举报
回复
32位的平台上,用vs2005带的编译器,刚开始嫌开VS麻烦就在命令行里编译的。GetTickCount是毫秒级还不够用?换了个汇编指令rdtsc的来试,第一个printf输出来的还是0.000000
柯本 2011-10-29
  • 打赏
  • 举报
回复
你用的什么编译器,什么平台?
就目前流行的编译器,都应该是32位的.unsigned 范围
unsigned int 32 0 <= X <= 4,294,967,295 Large numbers and loops
所以不会有你的问题,且按现在CPU的运算速度,65535次运算不可能到1S的


lghe001 2011-10-29
  • 打赏
  • 举报
回复
以为是精度问题,换了GetTickCount()来记录时间,还是这样

64,651

社区成员

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

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