我遇到了将此代码(来自Rosetta代码)作为更大的Windows窗体项目的一部分工作的问题:
这是一个简单的旧插入排序。它出错的地方是涉及第二个for循环的位(数字生成得很好),在它的排序部分。在循环的几次迭代中对我来说,j将成为负数,而其他语言如Javascript和Pascal似乎并不介意这一点...... C#并不高兴。
private void button3_Click(object sender, EventArgs e)
{
int i, j, k;
int[] a = new int[12];
Random randomObject = new Random();
ClearOutputs(); // this is an event which just clears the
text
from the text boxes.
//Generate some random numbers
for (i = 0; i < a.Length; i++)
{
a[i] = randomObject.Next(1, 1000);
textBox1.AppendText(a[i].ToString() + "\n");
}
for (i = 1; i <= a.Length; i++)
{
k = a[i];
//*******************
for (j = i; j > 0 & k < a[j - 1]; j--)
{
a[j] = a[j - 1];
a[j] = k;
}
}
// ***************
//Display them...it never executes this part.
for (i = 0; i < a.Length; i++)
{
textBox2.AppendText(a[i].ToString() + "\n");
}
}
长期修复将是我理解算法的编码...然后为自己修复它,但如果有人能指出我正确的方向...我已经尝试设置'为'循环在一个更高的初始值,但仍然得到相同的“System.IndexOutOfRangeException:'索引超出了数组的范围。'”任何帮助将不胜感激。
答案 0 :(得分:0)
按照提供的Rosetta Code算法,您应该将第二个“for”块更改为:
for (i = 1; i < a.Length; i++)
{
k = a[i];
for (j = i - 1; j >= 0 && a[j] > k; j--)
{
a[j + 1] = a[j];
}
a[j + 1] = k;
}