请大侠们解释下?

NewJerryj 2009-08-17 12:54:34

#include<iostream.h>
#include<windows.h>
#include<stdio.h>
#include <time.h>

#define NUM 100000

int Num[NUM];


void QuickSort(int left,int right,int FlagIndex)//,int SortNum[])
{

if(left<right)
{

int i=left,j=right,Flag=Num[FlagIndex];
while(i!=j)
{
while(j!=i)
{
if(Flag>Num[j])
{
Num[FlagIndex]=Num[j];
Num[j]=Flag;
FlagIndex=j;
i++;
break;
}
j--;
}

while(i!=j)
{
if(Flag<Num[i])
{
Num[FlagIndex]=Num[i];
Num[i]=Flag;
FlagIndex=i;
j--;
break;
}
i++;
}

}



QuickSort(left,i-1,left);//,SortNum);
QuickSort(i+1,right,i+1);//,SortNum);
}
return;

}



void main()
{


double dwOldTime,dwElapsed;

srand((unsigned)time(NULL));

cout<<"The random numbers are as follows:";
for(int i=0;i<NUM;i++)
{
Num[i]=rand()%100;
cout<<Num[i]<<" ";
}
cout<<endl<<endl<<endl;


dwOldTime=GetTickCount();
QuickSort(0,NUM-1,0); //,Num);
dwElapsed=GetTickCount()-dwOldTime;


cout<<"The sorted numbers are as follow:"<<endl;
for(i=0;i<NUM;i++)
cout<<Num[i]<<" ";
cout<<endl;
printf("It took %f to sort!\n",dwElapsed);

return;

}


以上代码是我写的用于测试快速排序算法的效率:随机生成N个数,放入数组,进行快速排序,显示出排序消耗的时间。
起初我使用局部变量数组Num[]来存放随机数字,发现超过100000后会有栈溢出,后来改进为使用全局数组。
但是当我把随机数的个数N设置为1000000(1百万个)时,发现运行不出结果,是不是递归深度超出最大深度的原因?
...全文
77 点赞 收藏 11
写回复
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
NewJerryj 2009-08-17

void test()
{
int a[1000000];
//This is a test
}
回复
NewJerryj 2009-08-17
[Quote=引用 1 楼 hyram 的回复:]
不知道你用的是什么环境,1000000的时候可能需要手动设置程序栈大小,有可能不够。我用codeblocks是可以的。
[/Quote]

用的VC6.0,这个除了和编译环境有关外,与系统有关吗?
回复
xingzhe2001 2009-08-17
[Quote=引用 4 楼 acrazer 的回复:]
可以肯定告诉你,全局数组一百万排序,肯定不会什么栈益处,
[/Quote]
全局数组当然不会溢。
楼主说"起初我使用局部变量数组Num[]来存放随机数字,发现超过100000后会有栈溢出",他把数组放在栈上,肯定没几下就溢了。
回复
NewJerryj 2009-08-17
奇怪了,为什么我每次插入源代码都没有按照格式显示?
回复
KWHOK 2009-08-17
可以肯定告诉你,全局数组一百万排序,肯定不会什么栈益处,

不信,你调用系统的qsort, sort试验下!

lz好好检查自己的quicksort吧
回复
xingzhe2001 2009-08-17
是啊,栈溢出,你想你每一层递归都要申请那么大的一个数组,栈很快就消耗干了。
回复
currenttt 2009-08-17
当NUM=1000000时,在VS2005环境下运行,会出现如下异常,即所谓的栈溢出:
Unhandled Exception at 0x004114d9....

应该是递归深度超出最大深度
回复
hyram 2009-08-17
#include <iostream.h> 
#include <windows.h>
#include <stdio.h>
#include <time.h>

#define NUM 100000

int Num[NUM];


void QuickSort(int left,int right,int FlagIndex)//,int SortNum[])
{

if(left <right)
{

int i=left,j=right,Flag=Num[FlagIndex];
while(i!=j)
{
while(j!=i)
{
if(Flag>Num[j])
{
Num[FlagIndex]=Num[j];
Num[j]=Flag;
FlagIndex=j;
i++;
break;
}
j--;
}

while(i!=j)
{
if(Flag <Num[i])
{
Num[FlagIndex]=Num[i];
Num[i]=Flag;
FlagIndex=i;
j--;
break;
}
i++;
}

}

QuickSort(left,i-1,left);//,SortNum);
QuickSort(i+1,right,i+1);//,SortNum);
}
return;

}

void main()
{
double dwOldTime,dwElapsed;

srand((unsigned)time(NULL));

cout <<"The random numbers are as follows:";
for(int i=0;i <NUM;i++)
{
Num[i]=rand()%100;
cout <<Num[i] <<" ";
}
cout <<endl <<endl <<endl;

dwOldTime=GetTickCount();
QuickSort(0,NUM-1,0); //,Num);
dwElapsed=GetTickCount()-dwOldTime;

cout <<"The sorted numbers are as follow:" <<endl;
for(int i=0;i <NUM;i++)
cout <<Num[i] <<";
cout <<endl;
printf("It took %f to sort!\n",dwElapsed);

return;

}

不知道你用的是什么环境,1000000的时候可能需要手动设置程序栈大小,有可能不够。我用codeblocks是可以的。
回复
LeonTown 2009-08-17
不好意思,
我总是在快排的细节上逻辑混乱。。。
回复
NewJerryj 2009-08-17
[Quote=引用 9 楼 leontown 的回复:]
在两个小while里面的if里,为什么还要分别i++和j--呢?
[/Quote]

分别在两边查找比flag数小和大的数时候,要向中间靠拢啊,这样才能达到i=j的状态,结束一趟排序
回复
LeonTown 2009-08-17
在两个小while里面的if里,为什么还要分别i++和j--呢?
回复
发动态
发帖子
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
社区公告
暂无公告