C# C语言中的简单合并排序#
我一直在做排序算法的小修改,并遇到了合并排序。我已经编写了我的代码,并且在过去的一个小时里一直在修改它,以确定为什么它仍然不能工作。我得到了标准的StackOverFlow异常。谁能告诉我算法出了什么问题吗?提前谢谢。以下是我迄今为止所写的内容:C# C语言中的简单合并排序#,c#,algorithm,sorting,mergesort,C#,Algorithm,Sorting,Mergesort,我一直在做排序算法的小修改,并遇到了合并排序。我已经编写了我的代码,并且在过去的一个小时里一直在修改它,以确定为什么它仍然不能工作。我得到了标准的StackOverFlow异常。谁能告诉我算法出了什么问题吗?提前谢谢。以下是我迄今为止所写的内容: public Int32[] MergeSort(Int32[] array) { int counter = 0; if (array.Length == 0) { return array; } int mid = arra
public Int32[] MergeSort(Int32[] array)
{
int counter = 0;
if (array.Length == 0) { return array; }
int mid = array.Length / 2;
Int32[] leftHalf = new Int32[mid+1];
Int32[] rightHalf = new Int32[mid+1];
for (int i = 0; i < mid; i++) {
leftHalf[i] = array[i];
}
for (int j = mid; j < array.Length; j++) {
rightHalf[counter] = array[j];
counter++;
}
counter = 0;
MergeSort(leftHalf);
MergeSort(rightHalf);
return SortAndMerge(leftHalf,rightHalf);
}
public Int32[] SortAndMerge(Int32[] left, Int32[] right) {
Int32[] myResult = new Int32[left.Length+right.Length];
while (left.Length > 0 || right.Length > 0) {
if (left.Length > 0 && right.Length > 0)
{
if (left[0] <= right[0])
{
myResult[myResult.Length] = left[0];
int toRemoveIndex = Array.IndexOf(left, left[0]);
left = left.Where((x, y) => y != toRemoveIndex).ToArray();
}
else
{
myResult[myResult.Length] = right[0];
int toRemoveIndex = Array.IndexOf(right, right[0]);
right = right.Where((z, g) => g != toRemoveIndex).ToArray();
}
}
else if (left.Length > 0)
{
myResult[myResult.Length] = left[0];
int toRemoveIndex = Array.IndexOf(left, left[0]);
left = left.Where((x, y) => y != toRemoveIndex).ToArray();
}
else if (right.Length > 0) {
myResult[myResult.Length] = right[0];
int toRemoveIndex = Array.IndexOf(right, right[0]);
right = right.Where((x, y) => y != toRemoveIndex).ToArray();
}
}
return myResult;
}
public Int32[]合并排序(Int32[]数组)
{
int计数器=0;
如果(array.Length==0){return array;}
int mid=数组长度/2;
Int32[]leftHalf=新的Int32[mid+1];
Int32[]rightHalf=新的Int32[mid+1];
对于(int i=0;i0 | | right.Length>0){
if(left.Length>0&&right.Length>0)
{
if(左[0]y!=toRemoveIndex.ToArray();
}
其他的
{
myResult[myResult.Length]=右[0];
int toRemoveIndex=Array.IndexOf(右,右[0]);
右=右。其中((z,g)=>g!=toRemoveIndex.ToArray();
}
}
else if(left.Length>0)
{
myResult[myResult.Length]=左[0];
int toRemoveIndex=Array.IndexOf(左,左[0]);
left=left.Where((x,y)=>y!=toRemoveIndex.ToArray();
}
否则如果(右。长度>0){
myResult[myResult.Length]=右[0];
int toRemoveIndex=Array.IndexOf(右,右[0]);
右=右。其中((x,y)=>y!=toRemoveIndex.ToArray();
}
}
返回我的结果;
}
这永远不会是真的,因此是例外,因为您总是这样创建数组
Int32[] leftHalf = new Int32[mid+1];
最小长度为1
在这里检查正确的合并排序算法
你介意重构吗?为什么不使用 这是来自msdn的样本
int[] numbers = { 1, 2, 3, 4 };
string[] words = { "one", "two", "three" };
var numbersAndWords = numbers.Zip(words, (first, second) => first + " " + second);
foreach (var item in numbersAndWords)
Console.WriteLine(item);
此代码生成以下输出:
一个
二二
三三
还有用于排序的linq。你能解释一下
MergeSort
函数中counter
在做什么吗?…我的意思是我知道它在做什么,但是为什么不使用rightshalf[j-mid]
而不是rightshalf[counter]
…可能会更清楚一些?很抱歉问Rustam,但是使用了这么多嵌套的if,真的需要吗?在了解为什么会出现这样的错误之前,我们是否应该研究一下如何去掉这些嵌套的if,作为我对算法的修订的一部分,我将看看算法是否确实需要这样的隐藏。调试器将为您提供堆栈跟踪,您可以逐行检查代码。这将为您提供大量关于正在发生的事情的信息,特别是关于永恒循环的信息。在这些上下文中,堆栈溢出通常意味着“无限递归”。检查您的边界条件。@DomFarolino为了附加到rightHalf,我使用了一个计数器作为索引rightHalf[0],rightHalf[1]等[j-mid]不会给出从0++开始的自然序列;虽然正确,谢谢,但它并不能解决问题。我正在考虑实现合并排序,这就是为什么ZIP对我不起作用的原因。无论如何,谢谢。
int[] numbers = { 1, 2, 3, 4 };
string[] words = { "one", "two", "three" };
var numbersAndWords = numbers.Zip(words, (first, second) => first + " " + second);
foreach (var item in numbersAndWords)
Console.WriteLine(item);