indexOutofRange使用inputbox时的BubbleSort

时间:2015-03-05 15:59:34

标签: c# bubble-sort indexoutofrangeexception

它一直困扰我几个小时,因为它总是在数字[i]返回0而我无法弄清楚问题。代码适用于不同的程序,但我必须更改它,以便它可以有一个自定义数组大小,那就是一切都出错了。 任何帮助都会很棒。 提前谢谢。

int[] numbers = new int[Convert.ToInt16(TxtArray.Text)];
int j = 0;
for (j = numbers.Length; j >= 0; j--)
{
    int i = 0;
    for (i = 0; i <= j - 1; i++)
    {
        string NumbersInput = Microsoft.VisualBasic.Interaction.InputBox("Enter Numbers to be sorted",
                "Numbers Input", "", -1, -1);
        numbers[i] = Convert.ToInt16(NumbersInput);     
       //returns 0 in if statement
        if (numbers[i] < numbers[i + 1])
        {           
            int intTemp = 0;
            intTemp = numbers[i];
            numbers[i] = numbers[i + 1];
            numbers[i + 1] = intTemp;
        }
    }
}

for (int i = 0; i < numbers.Length; i++)
{
    LstNumbers.Items.Add(numbers[i]);
}

2 个答案:

答案 0 :(得分:0)

撇开你如何使用文本框的陌生感,即使没有它们也会发生抛出异常的问题,因为它位于你的内环中:

for (i = 0; i <= j - 1; i++)

假设numbers.Length == 2。这意味着j == 2。所以在第一次通过外循环时,你会遇到这些条件的内循环。第一次通过i == 0。你到了if语句:

if (numbers[i] < numbers[i + 1])

numbers[0]存在,并且numbers[1]存在,因此此迭代会很好,i会递增。

现在i == 1。现在循环检查其边界条件。 i <= j - 1 == true,所以循环继续。现在当你点击那个if语句时,它会尝试访问numbers[i + 1],即不存在的numbers[2],抛出IndexOutOfRangeException

编辑:回过头来意识到我遗漏了解决方案(无论如何都是例外)。要使冒泡排序起作用,您的内循环边界条件应为i <= j - 2,因为j的初始值为== numbers.Length,这不是从零开始的,而数组索引是。

第二次修改:请注意,使用列表的只是实际上无法解决此问题。您必须使用正确的边界条件。尝试访问list[list.Count()]会抛出ArgumentOutOfRangeException。仅仅因为List会动态调整大小并不意味着它会以某种方式让您访问不存在的项目。无论您使用何种数据结构,都应该花时间检查边界条件。

答案 1 :(得分:0)

 private void button1_Click(object sender, EventArgs e)
{
  int sizeOfArrayInt = Convert.ToInt32(arraySize.Text);
  int[] array = new int[sizeOfArrayInt];
  string numbers = arrayValues.Text;
  string[] numbersSplit = numbers.Split(',');

  int count = 0;
  foreach (string character in numbersSplit)
  {
    int value;
    bool parse = Int32.TryParse(character, out value);
    if (value != null)
    {
      array[count] = value;
    }

    count++;
  }

  array = this.SortArray(array);
  foreach (int item in array)
  {
    this.listBox.Items.Add(item);
  }
}

private int[] SortArray(int[] arrayToSort)
{
  //int[] sortedArray = new int[arrayToSort.Length];
  int count = arrayToSort.Length;
  for (int j = count; j >= 0; j--)
  {
    int i = 0;
    for (i = 0; i <= j - 2; i++)
    {
      if (arrayToSort[i] < arrayToSort[i + 1])
      {
        int intTemp = 0;
        intTemp = arrayToSort[i];
        arrayToSort[i] = arrayToSort[i + 1];
        arrayToSort[i + 1] = intTemp;
      }
    }
  }

  return arrayToSort;
}

强文

这我作为Windows窗体工作,输出显示在列表框中,作为每个数组项或个体迭代数组。当然没有错误检查。希望有所帮助。