VB快速排序实现报错求助:System.IndexOutOfRangeException异常排查
嘿,我看到你刚学VB写快速排序的时候碰到了System.IndexOutOfRangeException这个麻烦,这个问题在快排实现里真的超常见,我来帮你捋捋最可能的原因和解决办法~
快速排序中索引越界的常见排查点
1. 左右指针的边界判断缺失
快排里我们会用左右指针遍历数组找交换元素,最容易踩的坑就是没给指针加边界限制:
比如你可能写了这样的循环:
While quicksort(left) < pivot left += 1 End While
如果数组里所有元素都比基准值pivot小,left会一直加到quicksort.Length,这时候访问quicksort(left)直接就越界了!
修正办法:给循环加上明确的边界判断:
While left <= right AndAlso quicksort(left) < pivot left += 1 End While While left <= right AndAlso quicksort(right) > pivot right -= 1 End While
2. 递归调用的参数范围错误
快排递归时需要传入子数组的上下界,如果参数传错或者没做前置判断,很容易出问题:
- 初始调用时把
high传成了quicksort.Length而不是quicksort.Length - 1(VB数组默认0基,最大索引是长度减1) - 递归前没判断
low < high,导致当子数组只有1个元素甚至空的时候还继续执行分区逻辑
修正办法:
- 初始调用必须传
quicksort.Length - 1作为high值 - 递归函数开头先加判断:
If low < high Then,只有子数组有至少2个元素才继续执行
3. 分区函数的基准值索引处理失误
如果你的分区函数里,基准值的位置处理不当(比如选择了数组外的索引当基准,或者交换元素时计算错误),也会触发越界。另外,用VB自带的UBound(arr)和LBound(arr)获取数组的最大/最小索引会比直接用Length-1更稳妥,避免数组不是0基的特殊情况。
给你一个可正常运行的VB快速排序示例
你可以对照自己的代码找差异:
Imports System Namespace Rextester Public Module Program Public Sub Main(args() As String) Dim quicksort() As Integer = {3,5,9,2,1,7,4,6,8} Console.WriteLine("排序前:" & String.Join(", ", quicksort)) QuickSort(quicksort, 0, quicksort.Length - 1) Console.WriteLine("排序后:" & String.Join(", ", quicksort)) End Sub Private Sub QuickSort(arr() As Integer, low As Integer, high As Integer) ' 只有子数组有至少2个元素才递归 If low < high Then Dim pivotPos As Integer = Partition(arr, low, high) QuickSort(arr, low, pivotPos - 1) QuickSort(arr, pivotPos + 1, high) End If End Sub Private Function Partition(arr() As Integer, low As Integer, high As Integer) As Integer ' 选择最后一个元素作为基准值 Dim pivot As Integer = arr(high) Dim i As Integer = low - 1 ' 小于基准值区域的最后一个索引 For j As Integer = low To high - 1 If arr(j) <= pivot Then i += 1 ' 交换元素 Dim temp As Integer = arr(i) arr(i) = arr(j) arr(j) = temp End If Next ' 将基准值放到正确位置 Dim tempPivot As Integer = arr(i + 1) arr(i + 1) = arr(high) arr(high) = tempPivot Return i + 1 End Function End Module End Namespace
对照着检查上面提到的几个边界点,应该就能定位到你代码里的问题啦~
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

