c ++

时间:2015-10-18 17:37:14

标签: c++ recursion stack-overflow

我有这个函数,它对数组进行递归选择排序:

void  SelectionSort::RecursiveSort(int ar[] , int flag, int first, int last){
    // first - index of first element and last - index of last element
    if (flag == 1)
    {
        if (first < last)               //ascending
        {
            for (int i = first; i <= last; i++) if (ar[i] < ar[first]) swap(ar[i], ar[first]);

            RecursiveSort(ar, flag, first + 1, last);
        }
        if (first == last) return;

    }
    else
    {
        if (first < last)                   //desc
        {
            for (int i = first; i <= last; i++) if (ar[i] > ar[first]) swap(ar[i], ar[first]);

            RecursiveSort(ar,flag, (first + 1), last);
        }
        if (first == last) return;

    }
}

如果数组大小为3000,它可以正常工作,但是我应该让这个工作的大小> 5000并且崩溃会导致堆栈溢出。

我搜索了许多线程,他们都告诉我使用矢量。这是一个赋值问题,所以我应该对数组和向量进行递归排序。它适用于矢量,但不适用于数组。此外,我不应该在此作业中使用指针。

2 个答案:

答案 0 :(得分:1)

您可以尝试使用尾递归,因此编译器会将其优化为循环:

void AscRecursiveSort(int ar[], int first, int last) {
    if (first >= last) return;
    for (int i = first; i <= last; i++) if (ar[i] < ar[first]) swap(ar[i], ar[first]);
    AscRecursiveSort(ar, first + 1, last);

}

void DescRecursiveSort(int ar[], int first, int last) {
    if (first >= last) return;
    for (int i = first; i <= last; i++) if (ar[i] > ar[first]) swap(ar[i], ar[first]);
    DescRecursiveSort(ar, first + 1, last);
}

void RecursiveSort(int ar[], int flag, int first, int last) {
    // first - index of first element and last - index of last element
    if (flag == 1)
        AscRecursiveSort(ar, first, last);              //ascending
    else
        DescRecursiveSort(ar, first, last);
}

答案 1 :(得分:1)

如果您的编译器没有优化尾递归,那么该解决方案将无法工作,您需要重写为检查基本情况的while循环。没有发布完整的解决方案,因为这看起来像家庭作业。