快速排序导致堆栈溢出

Quicksort causing stackoverflow?

本文关键字:栈溢出 堆栈 快速排序      更新时间:2023-10-16

这是我对快速排序的实现:

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;
        }
    }
}

但我得到了相同的结果。我做错了什么吗?如何使其适用于更大的阵列?

根据注释部分中的讨论,代码似乎很好,有问题的部分将是堆栈上数组的声明

int a[10];

这对于较小的数组来说很好,很容易遇到带有大型数组的堆栈溢出,要测试这一点,您可以声明一个大型int a[1000000]数组,如果没有快速排序代码,您仍然会得到堆栈溢出。因此,建议通过执行new在堆上声明它们