合并排序代码不工作

本文关键字:工作 代码 排序 合并 | 更新日期: 2023-09-27 17:50:39

我使用c#来实现mergessort()的代码;下面是我在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的行号;和合并(加勒比海盗、0、6、12);有谁能帮帮我吗

合并排序代码不工作

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

在最后一个for循环中迭代while i <R,即I>

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].