Visual Basic数组冒泡排序遇System.IndexOutOfRangeException问题求助
解决VB冒泡排序的索引越界问题并实现数组显示功能
问题根源
你的代码里有几个关键错误导致索引越界和排序失效:
- 索引变量用了
Decimal类型:数组索引必须是整数,用小数类型会让循环范围计算出错,进而触发索引越界。 - 循环边界用了数组元素值而非长度:
index2=-67.9、index3=99.9完全搞错了逻辑,冒泡排序的循环边界应该基于数组长度来控制,而非数组里的具体数值。 - 元素交换逻辑写错了:最后一步应该把临时值赋值给
numbers(index1+1),你写成了覆盖numbers(index1),等于没完成交换。 - 缺少数组输出代码:没有打印数组的逻辑,无法查看当前值和排序结果。
修正后的完整代码
Module BubbleSortDemo Sub Main() Dim temp As Decimal ' 索引变量必须用Integer类型,数组索引是整数 Dim i As Integer, j As Integer Dim numbers = New Decimal() {7.3, 32.2, 4.8, 28.3, -6.8, 101.7, -67.9, 40.7, 6.9, 99.9} Console.WriteLine("排序前的数组:") PrintArray(numbers) ' 冒泡排序核心逻辑:外层循环控制排序轮数,共数组长度-1轮 For i = 0 To numbers.Length - 2 ' 内层循环控制每轮比较的次数,每轮结束后末尾i个元素已经有序,不需要再比较 For j = 0 To numbers.Length - 2 - i If numbers(j) > numbers(j + 1) Then ' 正确的交换逻辑 temp = numbers(j) numbers(j) = numbers(j + 1) numbers(j + 1) = temp End If Next j ' 可选:打印每一轮排序后的数组状态,查看排序过程 Console.WriteLine(vbCrLf & $"第{i+1}轮排序后:") PrintArray(numbers) Next i Console.WriteLine(vbCrLf & "最终排序后的数组:") PrintArray(numbers) Console.ReadLine() End Sub ' 封装打印数组的方法,避免重复代码 Private Sub PrintArray(arr As Decimal()) For Each num In arr Console.Write(num & " ") Next Console.WriteLine() End Sub End Module
代码说明
- 把索引变量改成
Integer类型,确保循环范围准确,不会出现小数索引导致的越界。 - 外层循环次数设为
numbers.Length - 2(数组索引从0开始,最后一个元素不需要再参与比较)。 - 内层循环的结束位置是
numbers.Length - 2 - i,每轮结束后末尾的i个元素已经是有序的最大值,无需再参与后续比较。 - 修正了交换逻辑,确保两个元素正确互换。
- 添加了
PrintArray子过程,专门用来打印数组内容,能看到排序前、每轮排序后以及最终的结果。
运行这段代码后,你会在控制台看到数组的初始状态、每一轮排序后的变化,以及最终从小到大排好序的结果,不会再出现索引越界错误。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

