我知道在这个确切的主题上有很多帖子,但是我似乎无法使用其中的任何帖子来解决我所拥有的内容。我假设我的第一行
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,第二个元素为第二个字符串数组。似乎从未将其拉出并带到合并排序的下一个阶段。
任何帮助将不胜感激。
答案 0 :(得分:0)
对于递归,您需要在对MergeSort的递归调用之前放置一个 return ,否则递归循环将永远不会退出,您只需在调用堆栈上继续堆叠对MergeSort函数的调用。同样,对MergeSort的第二次调用将永远不会真正被调用,第一次递归调用会在函数执行之前退出该函数。
您基本上是从函数的开始循环到对该函数的第一次递归调用。