我想编写合并排序算法,当我调试程序并给它编号时,它会使索引超出范围错误,我的代码问题是什么?提前感谢。
private void button3_Click(object sender, EventArgs e)
{
string[] source = textBox1.Text.Split(',');
string[] source1 = textBox3.Text.Split(',');
int[] nums2 = new int[source1.Length + source.Length];
int[] nums = new int[source.Length];
for (int i = 0; i < source.Length; i++)
{
nums[i] = Convert.ToInt32(source[i]);
}
int[] nums1 = new int[source1.Length];
for (int j = 0; j < source1.Length; j++)
{
nums1[j] = Convert.ToInt32(source1[j]);
}
int x=0;
int y=0;
int z=0;
while (x <=nums.Length && y <= nums1.Length)
{
if (nums[x] <= nums1[y])///it gives out of range on this line
{
nums2[z] = nums[x];
x++;
}
else
{
nums2[z] = nums1[y];
y++;
}
z++;
}
if (x > nums.Length)
{
while (y <= nums1.Length)
{
nums2[z] = nums1[y];
z++;
y++;
}
if (y > nums1.Length)
{
while (x <= nums.Length)
{
nums2[z] = nums[x];
z++;
x++;
}
}
}
string merge = nums2[z].ToString();
textBox4.Text = merge;
}
}
答案 0 :(得分:4)
首先,IndexOutOfRangeException
不是编译错误,它是运行时错误。
数组中的索引是从0开始的。这意味着例如长度为3的数组具有索引0,1和2,但索引3不存在且超出范围。要在以下行中将错误更改<=
修改为<
:
while (x < nums.Length && y < nums1.Length)
while (y < nums1.Length)
while (x < nums.Length)
等...
你的程序中可能还有其他错误 - 这只是我看到的第一个错误。
答案 1 :(得分:1)
数组在C#中从零开始,这意味着数组中的第一项是索引0,而不是索引1.
但是,Length
属性返回数组中对象数量的从1开始的计数。因此,当您编写x <= nums.Length
时,您实际上是在尝试访问超出数组范围的索引。
相反,您应该将代码的该部分重写为:
while (x < nums.Length && y < nums1.Length)
{
if (nums[x] <= nums1[y])
{
nums2[z] = nums[x];
x++;
}
// etc.
答案 2 :(得分:0)
索引从0
开始,所以你应该这样做:
while (x < nums.Length && y < nums1.Length)