我的算法很简单 - 在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并且它工作正常。非常感谢你的帮助!
答案 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;
}