使用输入框时 indexOutofRange BubbleSort

indexOutofRange BubbleSort when using inputbox

它已经困扰我好几个小时了,因为它总是在 numbers[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]);
}

抛开您使用文本框的方式的奇怪之处,即使没有它们,您抛出异常的问题也会发生,因为它就在这里,在您的内部循环中:

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 会动态调整大小并不意味着它会以某种方式让您访问不存在的项目。无论您使用何种数据结构,您都应该始终花时间检查您的边界条件。

 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 表单的形式工作,输出在列表框中显示为每个数组项或数组上的单个 i 迭代。当然没有错误检查。希望有所帮助。