C#和负数组索引

时间:2017-11-14 17:18:01

标签: c# winforms sorting insertion

我遇到了将此代码(来自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:'索引超出了数组的范围。'”任何帮助将不胜感激。

1 个答案:

答案 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;
}