C# Merge Sort 创建堆栈溢出错误

C# Merge Sort creates stack overflow error

我知道有很多关于这个确切主题的帖子,但我似乎无法使用它们中的任何一个来修复我所拥有的。我假设我的第一行

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;
    }

数组以 100 个字符串的数组开头。当我尝试使用此程序时,程序 returns 出现此错误:

System.WhosebugException: 'Exception of type 'System.WhosebugException' was thrown.'

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

如有任何帮助,我们将不胜感激。

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

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