C# 类型为';的未处理异常;System.StackOverflowException';对三个整数的数组进行排序时在mscorlib.dll中发生

C# 类型为';的未处理异常;System.StackOverflowException';对三个整数的数组进行排序时在mscorlib.dll中发生,c#,arrays,sorting,quicksort,C#,Arrays,Sorting,Quicksort,我在尝试对数组排序时遇到上述错误: Array.Sort(myArray); 从下图可以看出,我试图完成的(使用三位数技术快速排序)是用另一个数组(第一个位置、中间位置和最后一个位置)中的三个整数填充一个数组。使用数组对数组进行排序。排序,然后选择中值作为轴心(位于位置[1]的排序数组的中间元素) 为什么会出现此错误:在mscorlib.dll中发生类型为“System.StackOverflowException”的未处理异常 注意:只有当第一个数组包含20000个元素,少于20000个元

我在尝试对数组排序时遇到上述错误:

Array.Sort(myArray);
从下图可以看出,我试图完成的(使用三位数技术快速排序)是用另一个数组(第一个位置、中间位置和最后一个位置)中的三个整数填充一个数组。使用
数组对数组进行排序。排序
,然后选择中值作为轴心(位于位置
[1]
的排序数组的中间元素)

为什么会出现此错误:
在mscorlib.dll中发生类型为“System.StackOverflowException”的未处理异常

注意:只有当第一个数组包含20000个元素,少于20000个元素时才会抛出此错误。算法正常工作 编辑:整个算法代码:

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);
            }
        }
publicstaticvoid算法(int[]数组,int开始,int结束)
{
int左=开始;
int右=结束;
int[]中值={array[start],(array[(start+(end-start))/2]),array[end]};
数组。排序(中值);
int pivot=中值[1];
while(左枢轴)
{
对--;
}

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

编辑:

在选择轴心点时还有一个小错误:

array[(start + (end - start)) / 2]
我想,你的意思是:

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

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

这个方法
AlgorithmB
递归调用自己。最有可能的是递归变得非常深入,这(几乎)填充调用堆栈。当某个对象尝试仅使用一个额外的堆栈帧或堆栈变量或类似对象时,异常将消失,因为堆栈无法再容纳任何对象

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


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

你能显示AlgorithmB方法的其余部分吗。它是否递归调用自己?我想你找错地方了……显示完整的AlgorithmB代码。它与Array.Sort.@Me.Name无关,是的。检查是否更新了完整的AlgorithmBcode@VladimirGondarev求求你ck updatedI我发现很难想象数组。排序以这种方式失败。一个小的、固定大小的数组通过排序网络最有效地排序。请参阅此问题的答案。我认为您是正确的,因为该方法被多次调用。我如何做?我是否要清除每个数组的调用?