C# C语言中的简单合并排序#

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

我一直在做排序算法的小修改,并遇到了合并排序。我已经编写了我的代码,并且在过去的一个小时里一直在修改它,以确定为什么它仍然不能工作。我得到了标准的StackOverFlow异常。谁能告诉我算法出了什么问题吗?提前谢谢。以下是我迄今为止所写的内容:

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