Quicksort崩溃超过500k元素

时间:2015-03-23 14:20:21

标签: c

我的算法很简单 - 在C中快速排序。 它是非常有效的(大约0.1s随机化并检查列表是否排序)但是当我想排序超过500k元素时它会崩溃。 不幸的是,我需要对它们进行更多排序,因为我需要在最后写出某种摘要:(

这是我的代码,也许有人会看到一个愚蠢的错误。 提前谢谢!

int quick (int a[],int begin,int end)
{
    int i = begin, j = end, w, q, pivot, k;
    q=begin+end;
    q=q/2;
    pivot=a[q];
    while (1)
    {
        while (a[j] > pivot && j>=0)
        j=j-1;
        while (a[i] < pivot && i<j)
        i=i+1;
        if (i < j)
        {
            k = a[i];
            a[i] = a[j];
            a[j] = k;
            i++;
            j--;
        }
        else
        return j;
    }
}

void quicks (int a[], int begin, int end)
{
    int x;
    if (end>begin)
    {
        x=quick(a,begin,end);
        quicks(a,begin,x);
        quicks(a,x+1,end);

    }
}

似乎我只需要使用malloc并且它工作正常。非常感谢你的帮助!

2 个答案:

答案 0 :(得分:2)

您正在遭受RAM耗尽/翻转:当您使用 int 的数组时,每个都需要4个字节。使用 size_t 类型索引处理内存映射。如果您在32位模式下编译(可能是您的情况),它可以获得的最大数字是2147483648(2 ^ 31)。每个int有4个字节,你只能处理536870912个元素(2 ^ 31/4)。

由于系统需要一些RAM用于其他目的(例如全局变量),因此您只能使用超过500K的条目。

解决方案:使用64位编译器,你应该没问题。

BR

答案 1 :(得分:1)

这是另一个更简单的实现。

void quickSort(int a[], int begin, int end)
{
    int left = begin - 1, right = end + 1, tmp;
    const int pivot = a[(begin+end)/2];

    if (begin >= end)
        return;

    while(1)    
    {
        do right--; while(a[right] > pivot);
        do left++; while(a[left] < pivot);

        if(left < right)
        {
            tmp = a[left];
            a[left] = a[right];
            a[right] = tmp;
        }
        else 
            break;
    }
    quickSort(a, begin, right);    
    quickSort(a, right+1, end);
}

你这样称呼它

int main(void)
{
    int tab[5] = {5, 3, 4, 1, 2};
    int i;

    quickSort(tab, 0, 4); // 4 is index of lest element of tab

    for(i = 0; i < 5; i++)
        printf("%d ", tab[i]);
    printf("\n");

    return 0;
}