c# - 如何在 C# 中修复此合并排序的实现

标签 c# algorithm mergesort

我已阅读 CLRS 并尝试实现递归归并排序算法。看不到错误是什么,但每次我运行它都会给我一个“索引越界错误”

我现在已经尝试了 5 小时

static public void MergeSort(int[] input, int IndexStanga, int IndexDreapta)
{
    if (IndexStanga < IndexDreapta)
    {
        int IndexMijloc = (IndexDreapta + IndexStanga) / 2;
        MergeSort(input, IndexStanga, IndexMijloc);
        MergeSort(input, IndexMijloc + 1, IndexDreapta);

        Merge(input, IndexStanga, IndexDreapta, IndexMijloc);
    }
}

static public void Merge(int[] input, int stanga, int dreapta, int mijloc)
{
    int lungDR = 0;
    int lunST = 0;
    lungDR = dreapta - mijloc;
    lunST = mijloc - stanga + 1;
    int[] valDreapta = new int[lungDR + 1];
    int[] valStanga = new int[lunST + 1];

    valDreapta[valDreapta.Length - 1] = int.MaxValue;
    valStanga[valStanga.Length - 1] = int.MaxValue;

    int i = 0;
    int j = 0;

    for (i = stanga; i <= mijloc; i++) valStanga[i] = input[i];

    for (i = 0; i < lungDR; i++) { valDreapta[i] = input[i + mijloc + 1]; }

    i = 0;
    j = 0;

    for (int k = 0; k < input.Length; k++)
    {
        if (valStanga[i] <= valDreapta[j]) //error out of bounds 
        {
            input[k] = valStanga[i];
            i++;
        }
        else
        {
            input[k] = valDreapta[j];
            j++;
        }
    }
}

最佳答案

以下评论中指出的修复。将数据从输入移动到 valStanga 的第一个修复。合并回输入的范围的第二个修复。 merge 的参数顺序很不寻常,first,last,middle。通常顺序是第一、中间、最后。

评论:如果要排序的数组包含等于最大整数的元素,程序将出现问题。一次性分配一个工作数组比在每次调用合并时分配新的子数组效率更高。可以通过改变每个递归级别的合并方向来避免复制操作。

    int i = 0;
    int j = 0;

    for (i = 0; i < lungDR; i++) { valDreapta[i] = input[i + mijloc + 1]; }
    for (i = 0; i < lunST; i++) { valStanga[i] = input[i + stanga]; }      // fix

    i = 0;
    j = 0;

    for (int k = stanga; k <= dreapta; k++)                                // fix
    {
        if (valStanga[i] <= valDreapta[j])

关于c# - 如何在 C# 中修复此合并排序的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57022134/

相关文章:

c# - 抓取基于登录的网站的最佳方式是什么?

c# - PropertyChanged 事件始终为空

c# - 我是否需要在每个实现 IDisposable 的对象中使用 "using"关键字?

c++ - 为什么当数组有重复值时快速排序算法持续时间会增加?

java - 如何在没有错误 ArrayIndexOutOfBoundsException 的情况下实现具有 4 向分区的合并排序算法?

c# - MVC 是特定于 Web 应用程序的吗?

c++ - 求所有可能的点对之间力的总和?

c# - 在 C# 中获取 List<List<int>> 的所有组合(也包含部分结果)

arrays - 所有对象都可以按顺序配对吗?

c++ - 删除数组时出现堆损坏错误