这是我对quicksort的实现:
int choosePivotIndex(int l, int r)
{
return l + rand() % (r + 1 - l);
}
void swap(int a[], int l, int r)
{
int tmp = a[l];
a[l] = a[r];
a[r] = tmp;
}
int partition(int a[], int l, int r)
{
int p = choosePivotIndex(l, r);
swap(a, p, r);
int d = l;
for (int i = l ; i < r ; ++i)
{
if (a[i] < a[r])
{
swap(a, i, d);
++d;
}
}
swap(a, d, r);
return d;
}
void quickSort(int a[], int l, int r)
{
if (l < r)
{
int p = partition(a, l, r);
quickSort(a, l, p - 1);
quickSort(a, p + 1, r);
}
}
void quickSort(int a[], int len)
{
srand(static_cast<unsigned int>(time(nullptr)));
quickSort(a, 0, len - 1);
}
我这样使用它:
int a[10];
quickSort(a, 10);
它似乎适用于小型数组但是当我提供一个大型数组(例如300 000
元素)时,我得到堆栈溢出错误。我尝试通过仅在较小的部分上使用递归并在while
循环中对较大的部分进行排序来补救它:
void quickSort(int a[], int l, int r)
{
while (l < r)
{
int p = partition(a, l, r);
if (p - l < r - p)
{
quickSort(a, l, p - 1);
l = p + 1;
}
else
{
quickSort(a, p + 1, r);
r = p - 1;
}
}
}
但我得到了同样的结果。我做错了什么吗?如何使其适用于更大的阵列?
答案 0 :(得分:2)
根据评论部分的讨论,代码看起来很好,违规部分将是堆栈上数组的声明
int a[10];
这对于较小的数组很好,很容易遇到大型数组的堆栈溢出,为了测试这个,你可以声明一个大数组int a[1000000]
而没有快速排序代码,你仍然会得到堆栈溢出。因此,建议通过执行new