Mergesort代码不起作用

时间:2014-03-17 10:01:29

标签: c# algorithm sorting

我使用C#来实现mergesort()的代码; 这是我在main()

中编写的代码
static void Main(string[] args)
    {
        int[] arr = { 5,9,2,-10,53,-64,10,22,15,-60,2,3};
        Merge(arr,0,6,12);
    }

这是Merge()函数

public static void Merge(int[] arr,int p,int q,int r ) 
    {
        int n1 = q-p;
        int n2 = r-q;
        int[] L=new int[n1];
        int[] R = new int[r-n2];
        for (int i = 0; i < n1; i++)
            L[i] = arr[i];
        foreach (int x in L)
            Console.WriteLine(x);
        for (int i = 0; i < r-n2; i++)
            R[i] = arr[q+i];
        Console.WriteLine("New part");
        foreach (int x in R)
            Console.WriteLine(x);
        int k=0, d=0;
        for (int i = p; i < r; i++)
        {
            if (L[k] <= R[k])
            {
                arr[i] = L[k];
                k++;
            }
            else
            {
                arr[i] = R[d];
                d++;
            }
        }
    }

代码显示异常作为索引越界,引用包含int n1 = q-p的行号;和合并(arr,0,6,12); 任何人都可以帮助我

1 个答案:

答案 0 :(得分:1)

R []的长度= r - n2 = 12 - (12 - 6)= 6.

在最后一个for循环中,你迭代i&lt; r,即i < 12.这意味着您可能会尝试在else语句中从R []获取索引0 - 11。这给你一个例外。

for (int i = p; i < r; i++)
    {
        if (L[k] <= R[k])
        {
            arr[i] = L[k];
            k++;
        }
        else
        {
            arr[i] = R[d];
            d++;
        }
    }

例外情况从arr [i] = R [d]开始。

编辑:你确定你对R []长度的定义吗?

int n2 = r - q;
...
int[] R = new int[r-n2]; // this is the same as int[] R = new int[q].