主题:請看看我這QuickSort為什麼出錯...
josephkwok [专家分:530] 发布于 2010-06-29 22:48:00
為什麼這個代碼會出錯呢???
把 N 改小了就沒問題,改大了就出問題
我在VS2008上運行的...
[code]
#include <iostream>
#include <time.h>
#define N 1000000
using namespace std;
int Partition(int a[],int p,int q)
{
int t,i,j=p,x=a[q];
for (i=p;i<q;i++)
{
if (a[i]<x)
{
t=a[j];
a[j]=a[i];
a[i]=t;
j++;
}
}
t=a[q];
a[q]=a[j];
a[j]=t;
return j;
}
void QS(int a[],int p,int q)
{
if(p<q)
{
int x=Partition(a,p,q);
QS(a,p,x-1);
QS(a,x+1,q);
}
}
void QuickSort(int a[],int n)
{
QS(a,0,n-1);
}
int main()
{
int a[N],i;
srand(time(0));
for (i=0;i<N;i++)
{
a[i]=rand()%N;
}
QuickSort(a,N);
for (i=0;i<N-1;i++)
{
if (a[i]>a[i+1])
{
cout<<"error"<<endl;
}
}
return 0;
}
[/code]
回复列表 (共9个回复)
沙发
yxqyrh [专家分:1070] 发布于 2010-06-29 23:14:00
栈溢出,大概超过2M或者4M就会溢出
板凳
josephkwok [专家分:530] 发布于 2010-06-30 00:23:00
那怎麼解決啊...
如果只能對小的數量排序的話,那QuickSort不就很大限制了嗎???
3 楼
雪光风剑 [专家分:27190] 发布于 2010-06-30 05:26:00
调整数据结构
连续分配这么大数组肯定会溢出的
4 楼
josephkwok [专家分:530] 发布于 2010-06-30 09:09:00
你看下面的代碼,怎麼就沒這個問題呢???
[code]
#include <iostream>
#include <cmath>
#include <time.h>
using namespace std;
int prime[1000000];
int main()
{
int i, j;
memset(prime, 1, sizeof(prime));
for(i = 2; i < 1000; i++)
if(prime[i])
for(j = i*2; j < 1000000; j+=i)
prime[j] = 0;
int n;
while(scanf("%d", &n) && n != 0)
{
int i;
for(i = 2; i <= n/2; i++)
if(prime[i] && prime[n-i])
{
printf("%d = %d + %d\n", n, i, n-i);
break;
}
if(i == n/2+1)
printf("Goldbach's conjecture is wrong.\n");
}
return 0;
}
[/code]
5 楼
雪光风剑 [专家分:27190] 发布于 2010-06-30 21:48:00
当n过大的时候,会爆掉内存的可不只有全局堆的数组……递归的时候每次一套的数据开销也不小,更何况您老还蛋疼地写了两个函数来处理排序……如果不理解我说的这句话的话,计算一下你的排序需要执行的次数,再计算一下每次一套变量的内存开销,乘一下吧!
6 楼
josephkwok [专家分:530] 发布于 2010-07-01 00:17:00
哦哦.那我內存有2G的喔,怎麼在幾m就用完了呢???
7 楼
雪光风剑 [专家分:27190] 发布于 2010-07-01 07:21:00
[quote]哦哦.那我內存有2G的喔,怎麼在幾m就用完了呢???[/quote]
可以给应用程序申请的地址空间可没有2G,这是第一,其次,你计算了你递归次数下要吃掉的内存了么……
8 楼
josephkwok [专家分:530] 发布于 2010-07-01 12:54:00
我粗略算了下, partition 的局部變量在 該函數結束時就沒了,耗內存的是 QS的兩個參數 p,q .在快速排序的最快情況下要耗內存大概是 (2n-1)*4 B . 還有,那你有沒有對這個QucikSort 有什麼好的改造方案呢???
9 楼
sinis [专家分:0] 发布于 2010-10-09 17:04:00
第一个程序溢出,原因是:数组声明在栈上,数据超过限制溢出
第二个程序没有溢出,原因是:数组声明在全局区上,数据没超过限制
我来回复