Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 递归快速排序引发堆栈溢出异常_C#_Recursion_Quicksort_Stack Overflow - Fatal编程技术网

C# 递归快速排序引发堆栈溢出异常

C# 递归快速排序引发堆栈溢出异常,c#,recursion,quicksort,stack-overflow,C#,Recursion,Quicksort,Stack Overflow,我使用Visual Studio用c#编写了一个递归快速排序算法。奇怪的是,当数组中的输入(将被排序的数字的集合)低于9500时,它会在最好、最坏和最坏的情况下给出结果。但是,当输入大于9500时,会引发stackoverflow异常。我知道还有一个问题和我在网站上的问题几乎一样,但我做的条件也是可以递归的 public int[]quick(int[]myarray,int p,int r) { int-q; if(p

我使用Visual Studio用c#编写了一个递归快速排序算法。奇怪的是,当数组中的输入(将被排序的数字的集合)低于9500时,它会在最好、最坏和最坏的情况下给出结果。但是,当输入大于9500时,会引发stackoverflow异常。我知道还有一个问题和我在网站上的问题几乎一样,但我做的条件也是可以递归的


public int[]quick(int[]myarray,int p,int r)
{
int-q;
if(p
您将执行最坏情况下的快速排序。数组已排序,请尝试再次排序

接下来,您的partition()代码看起来确实很奇怪:

int i = left - 1;                   // i = left-1
int pivot = myarray[right];
for (int j = left; j < right; j++)  // j = left
{
    if (myarray[j] < pivot)
    {
        i = i + 1;                  // now i = left-1+1 = left = j
        tmp = myarray[i];
        myarray[i] = myarray[j];
        myarray[j] = tmp;           

        // congratulations!
        // you successfully exchanged a value with itself!
    }

您可以看到,使用9000个元素执行此操作将很容易达到9000个嵌套调用的递归级别。

无需大声喊叫!!!如果递归算法得到堆栈溢出,这通常意味着你对底层情况的测试是不正确的。当我使用1000000个元素的数组运行你的代码时,它在我的计算机上运行得很好。谢谢你所做的一切,但我得到了我所需要的。通过优化我的算法,现在它运行得很好。别忘了再次感谢……如果一个问题被否决的原因已经纠正,这将有助于那些选民扭转他们的投票。我们不想阻止看到这个问题的新用户寻求编程帮助。但是9.000次调用如何耗尽1MB堆栈?
int i = left - 1;                   // i = left-1
int pivot = myarray[right];
for (int j = left; j < right; j++)  // j = left
{
    if (myarray[j] < pivot)
    {
        i = i + 1;                  // now i = left-1+1 = left = j
        tmp = myarray[i];
        myarray[i] = myarray[j];
        myarray[j] = tmp;           

        // congratulations!
        // you successfully exchanged a value with itself!
    }
 quick( 0, 8)
> quick( 0, 7)
>> quick( 0, 6)
>>> quick( 0, 5)
>>>> quick( 0, 4)
>>>>> quick( 0, 3)
>>>>>> quick( 0, 2)
>>>>>>> quick( 0, 1)
>>>>>>>> quick( 0, 0)
>>>>>>>> quick( 2, 1)
>>>>>>> quick( 3, 2)
>>>>>> quick( 4, 3)
>>>>> quick( 5, 4)
>>>> quick( 6, 5)
>>> quick( 7, 6)
>> quick( 8, 7)
> quick( 9, 8)