C#合并排序会产生堆栈溢出错误

时间:2019-03-10 16:55:29

标签: c# stack-overflow mergesort

我知道在这个确切的主题上有很多帖子,但是我似乎无法使用其中的任何帖子来解决我所拥有的内容。我假设我的第一行

if (array.Length > 1)

某种程度上导致了错误,但是我不确定如何。这是代码。

public static string[] MergeSort(string[]array)
    {
        if (array.Length > 1)
        {
            int mid = array.Length / 2;
            string[] lefthalf = new string[mid];
            for (int l = 0; l < mid; l++)
            {
                lefthalf[l] = array[l];
            }
            string[] righthalf = new string[mid + 1];
            for (int r = mid; r < righthalf.Length ; r++)
            {
                righthalf[r] = array[r];
            }
            MergeSort(lefthalf);
            MergeSort(righthalf);
            int i = 0;
            int j = 0;
            int k = 0;
            while (i < lefthalf.Length && j < righthalf.Length)
            {
                if (String.Compare(lefthalf[i],righthalf[j]) == -1)
                {
                    array[k] = lefthalf[i];
                    i += 1;
                }
                else
                {
                    array[k] = righthalf[k];
                    j += 1;
                }
                k = k + 1;
            }

            while (i< lefthalf.Length)
            {
                array[k] = lefthalf[i];
                i += 1;
                k += 1;
            }
            while (j < righthalf.Length)
            {
                array[k] = righthalf[j];
                j += 1;
                k += 1;
            }
        }
        return array;
    }

array以100个字符串的数组开头。当我尝试使用此过程时,程序将返回以下错误:

  

System.StackOverflowException:'类型的异常   抛出“ System.StackOverflowException”。

在评论中被告知后,我尝试调试,它似乎处于创建长度为2的数组的无限循环中,其中第一个元素为null,第二个元素为第二个字符串数组。似乎从未将其拉出并带到合并排序的下一个阶段。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

对于递归,您需要在对MergeSort的递归调用之前放置一个 return ,否则递归循环将永远不会退出,您只需在调用堆栈上继续堆叠对MergeSort函数的调用。同样,对MergeSort的第二次调用将永远不会真正被调用,第一次递归调用会在函数执行之前退出该函数。

您基本上是从函数的开始循环到对该函数的第一次递归调用。