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 的第二次调用永远不会真正被调用,第一次递归调用在函数执行之前退出该函数。
您基本上是从函数的开头循环到对该函数的第一次递归调用。
我知道有很多关于这个确切主题的帖子,但我似乎无法使用它们中的任何一个来修复我所拥有的。我假设我的第一行
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 的第二次调用永远不会真正被调用,第一次递归调用在函数执行之前退出该函数。
您基本上是从函数的开头循环到对该函数的第一次递归调用。