我使用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); 任何人都可以帮助我
答案 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].