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