Visual Basic 快速排序算法崩溃 - 'System.StackOverflowException'
Visual Basic Quicksort Algorithm crash - 'System.StackOverflowException'
我目前正尝试在 Visual Basic 中编写快速排序算法。
我最初是通过寻找可以作为算法基础的预写代码来尝试这个的。但是,我发现的大部分代码都是使用我经验不足的语言编写的。
我也通过寻找伪代码示例来尝试这样做。我已将我的代码与互联网上提供的伪代码示例进行了比较,但仍然无法正确获取代码 运行。
当前的问题是“QuickSort.exe 中发生类型 'System.WhosebugException' 的未处理异常”,只要程序 运行 中有 运行domly 生成的数据 'intGeneratedData'数组。此错误指向过程的 'Private Sub' 行。
Private Sub QuicksortAlgorithm(ByRef intGeneratedData() As Integer, ByVal intSize As Integer)
Dim intPivotValue, intLower, intUpper, intSwapTemp As Integer
If (intSize > 1) Then
intPivotValue = intGeneratedData((Int((intSize * Rnd()) + 1)))
intLower = 0
intUpper = (intSize - 1)
While intLower <= intUpper
While intGeneratedData(intLower) < intPivotValue
intLower += 1
End While
While intGeneratedData(intUpper) > intPivotValue
intUpper -= 1
End While
'Swap lower and upper value
If intLower <= intUpper Then
intSwapTemp = intGeneratedData(intLower)
intGeneratedData(intLower) = intGeneratedData(intUpper)
intGeneratedData(intUpper) = intSwapTemp
intLower += 1
intUpper -= 1
End If
End While
QuicksortAlgorithm(intGeneratedData, intLower)
QuicksortAlgorithm(intGeneratedData, (intUpper - intLower))
End If
End Sub
注意:调用算法时,'intSize'始终是数组的大小'intGeneratedData'。
我觉得好像还有其他错误我没有在这个过程中提到,因为我以前遇到过另一个错误,然后我改变了很多东西来导致这个。我一直试图让它工作几天但没有成功。如果此线程未提供有关该问题的信息,我们深表歉意。
如有任何帮助,我们将不胜感激。
这是一个递归算法,您不能在函数中使用 return 语句提前退出它。您在函数底部又调用了两次 QuicksortAlgorithm。你的算法永远不会结束——它只会永远调用自己。如果我不得不猜测,我会说将其添加到函数的顶部:
If intSize < 1 Then
Return
End If
发件人:http://mark.random-article.com/weber/ada/week13.html
参见:
递归要求
...您缺少退出条件
退出条件或 "Stopping Case"(如书中所说)——我也听说过它被称为 "Base Case"。这是函数最终 return 并且不再调用自身的状态。退出条件是递归函数的关键组成部分。如果你没有在那里,它永远不会退出。 退出条件通常是递归函数中的第一件事。
我目前正尝试在 Visual Basic 中编写快速排序算法。
我最初是通过寻找可以作为算法基础的预写代码来尝试这个的。但是,我发现的大部分代码都是使用我经验不足的语言编写的。
我也通过寻找伪代码示例来尝试这样做。我已将我的代码与互联网上提供的伪代码示例进行了比较,但仍然无法正确获取代码 运行。
当前的问题是“QuickSort.exe 中发生类型 'System.WhosebugException' 的未处理异常”,只要程序 运行 中有 运行domly 生成的数据 'intGeneratedData'数组。此错误指向过程的 'Private Sub' 行。
Private Sub QuicksortAlgorithm(ByRef intGeneratedData() As Integer, ByVal intSize As Integer)
Dim intPivotValue, intLower, intUpper, intSwapTemp As Integer
If (intSize > 1) Then
intPivotValue = intGeneratedData((Int((intSize * Rnd()) + 1)))
intLower = 0
intUpper = (intSize - 1)
While intLower <= intUpper
While intGeneratedData(intLower) < intPivotValue
intLower += 1
End While
While intGeneratedData(intUpper) > intPivotValue
intUpper -= 1
End While
'Swap lower and upper value
If intLower <= intUpper Then
intSwapTemp = intGeneratedData(intLower)
intGeneratedData(intLower) = intGeneratedData(intUpper)
intGeneratedData(intUpper) = intSwapTemp
intLower += 1
intUpper -= 1
End If
End While
QuicksortAlgorithm(intGeneratedData, intLower)
QuicksortAlgorithm(intGeneratedData, (intUpper - intLower))
End If
End Sub
注意:调用算法时,'intSize'始终是数组的大小'intGeneratedData'。
我觉得好像还有其他错误我没有在这个过程中提到,因为我以前遇到过另一个错误,然后我改变了很多东西来导致这个。我一直试图让它工作几天但没有成功。如果此线程未提供有关该问题的信息,我们深表歉意。
如有任何帮助,我们将不胜感激。
这是一个递归算法,您不能在函数中使用 return 语句提前退出它。您在函数底部又调用了两次 QuicksortAlgorithm。你的算法永远不会结束——它只会永远调用自己。如果我不得不猜测,我会说将其添加到函数的顶部:
If intSize < 1 Then
Return
End If
发件人:http://mark.random-article.com/weber/ada/week13.html
参见:
递归要求
...您缺少退出条件
退出条件或 "Stopping Case"(如书中所说)——我也听说过它被称为 "Base Case"。这是函数最终 return 并且不再调用自身的状态。退出条件是递归函数的关键组成部分。如果你没有在那里,它永远不会退出。 退出条件通常是递归函数中的第一件事。