未处理的类型' System.StackOverflowException'在排序三个整数的数组时发生在mscorlib.dll中

时间:2014-04-19 17:47:47

标签: c# arrays sorting quicksort

尝试对数组进行排序时出现上述错误:

Array.Sort(myArray);

我想要完成的任务(使用三种技术的中间值进行快速排序),从下图中可以看出填充一个数组,其中包含来自另一个数组的三个整数(第一个位置,中间位置和最后一个位置)对数组进行排序通过使用Array.Sort然后选择中位数作为枢轴(排序数组的中间元素位于[1]位置) image of the array

为什么我收到此错误: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);
            }
        }

2 个答案:

答案 0 :(得分:1)

此方法AlgorithmB递归调用自身。最有可能的是递归变得非常深,它(几乎)填满了调用堆栈。当某些东西试图只使用一个额外的堆栈帧或堆栈变量或类似物时,异常就会消失,因为堆栈不能再持有。

这并不一定意味着问题出在Array.Sort

检查调用堆栈,看看我的理论是否得到了证实。

答案 1 :(得分:-1)

在我看来,Vladimir是正确的,它与Array.Sort无关,但假设它有,那么你可以用一些简单的if-constructs轻松替换它。这应该是一个简单的任务,因为您只需要找到三个值(开始,中间和结束)的轴。

编辑:

您的枢轴选择中也存在一个小错误:

array[(start + (end - start)) / 2]

我想,你的意思是:

array[(start + (end - start) / 2)]

Edit2:一个不太有利的枢轴可以负责更多的递归调用;)