尝试对数组进行排序时出现上述错误:
Array.Sort(myArray);
我想要完成的任务(使用三种技术的中间值进行快速排序),从下图中可以看出填充一个数组,其中包含来自另一个数组的三个整数(第一个位置,中间位置和最后一个位置)对数组进行排序通过使用Array.Sort
然后选择中位数作为枢轴(排序数组的中间元素位于[1]
位置)
为什么我收到此错误:An unhandled exception of type 'System.StackOverflowException' occurred in mscorlib.dll
?
注意:当第一个数组包含20000个元素时,只会抛出此错误,小于20000算法正常工作 编辑:整个AlgorithmB代码:
public static void AlgorithmB(int[] array, int start, int end)
{
int left = start;
int right = end;
int[] median = {array[start],(array[(start + (end - start)) / 2]),array[end]};
Array.Sort(median);
int pivot = median[1];
while (left <= right)
{
while (array[left] < pivot)
{
left++;
}
while (array[right] > pivot)
{
right--;
}
if (left <= right)
{
swap(array, left, right);
left++;
right--;
}
}
// Recursive calls
if (start < right)
{
AlgorithmB(array, start, right);
}
if (left < end)
{
AlgorithmB(array, left, end);
}
}
答案 0 :(得分:1)
此方法AlgorithmB
递归调用自身。最有可能的是递归变得非常深,它(几乎)填满了调用堆栈。当某些东西试图只使用一个额外的堆栈帧或堆栈变量或类似物时,异常就会消失,因为堆栈不能再持有。
这并不一定意味着问题出在Array.Sort
。
检查调用堆栈,看看我的理论是否得到了证实。
答案 1 :(得分:-1)
在我看来,Vladimir是正确的,它与Array.Sort无关,但假设它有,那么你可以用一些简单的if-constructs轻松替换它。这应该是一个简单的任务,因为您只需要找到三个值(开始,中间和结束)的轴。
编辑:
您的枢轴选择中也存在一个小错误:
array[(start + (end - start)) / 2]
我想,你的意思是:
array[(start + (end - start) / 2)]
Edit2:一个不太有利的枢轴可以负责更多的递归调用;)