回 帖 发 新 帖 刷新版面

主题:請看看我這QuickSort為什麼出錯...

為什麼這個代碼會出錯呢???
把 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个回复)

沙发

栈溢出,大概超过2M或者4M就会溢出

板凳

那怎麼解決啊...
如果只能對小的數量排序的話,那QuickSort不就很大限制了嗎???

3 楼

调整数据结构
连续分配这么大数组肯定会溢出的

4 楼

你看下面的代碼,怎麼就沒這個問題呢???
[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 楼

当n过大的时候,会爆掉内存的可不只有全局堆的数组……递归的时候每次一套的数据开销也不小,更何况您老还蛋疼地写了两个函数来处理排序……如果不理解我说的这句话的话,计算一下你的排序需要执行的次数,再计算一下每次一套变量的内存开销,乘一下吧!

6 楼

哦哦.那我內存有2G的喔,怎麼在幾m就用完了呢???

7 楼

[quote]哦哦.那我內存有2G的喔,怎麼在幾m就用完了呢???[/quote]
可以给应用程序申请的地址空间可没有2G,这是第一,其次,你计算了你递归次数下要吃掉的内存了么……

8 楼

我粗略算了下, partition 的局部變量在 該函數結束時就沒了,耗內存的是 QS的兩個參數 p,q .在快速排序的最快情況下要耗內存大概是 (2n-1)*4 B . 還有,那你有沒有對這個QucikSort 有什麼好的改造方案呢???

9 楼

第一个程序溢出,原因是:数组声明在栈上,数据超过限制溢出
第二个程序没有溢出,原因是:数组声明在全局区上,数据没超过限制

我来回复

您尚未登录,请登录后再回复。点此登录或注册