我最近一直试图在visual basic中创建一个选择排序程序。我设法让它按照降序对数组中的整数进行排序,然而,当我尝试使用相同的方法将数组按升序排序时,它会成功完成,但我会得到一个&# 34;指数超出范围"错误。以下是我的代码:
Sub sortDescending()
Dim array() As Integer = {3, 5, 200}
Dim maxPos As Integer
Dim firstI As Integer
While firstI <= UBound(array)
For i = firstI To UBound(array)
If array(i) > array(maxPos) Then
maxPos = i
End If
Next
Dim largestNumber As Integer = array(maxPos)
array(maxPos) = array(firstI)
array(firstI) = largestNumber
firstI = firstI + 1
maxPos = firstI
Console.WriteLine(largestNumber)
End While
End Sub
Sub sortAscending()
Dim array() As Integer = {3, 5, 200}
Dim minpos As Integer
Dim firstI As Integer
While firstI >= LBound(array)
For i = firstI To LBound(array)
If array(i) < array(minpos) Then
minpos = i
End If
Next
Dim smallestNumber As Integer = array(minpos)
array(minpos) = array(firstI)
array(firstI) = smallestNumber
firstI = firstI + 1
minpos = firstI
Console.WriteLine(smallestNumber)
End While
正如我所说,降序排序没有任何问题,但升序排序正在给我错误。有人能告诉我如何解决这个问题吗?谢谢:))
答案 0 :(得分:0)
如果您不使用内置order by
,则应用选择排序,则必须正确定义排序算法。
你实际遇到的问题虽然循环永远不会结束所以总是检查是真的。我已经将它转换为for循环并纠正了最后的交换。
这是一个使用您的测试用例的函数。
Private Sub SortArray(ByRef array() As Integer)
Dim i As Integer
Dim j As Integer
Dim minimum As Integer
Dim swapValue As Integer
Dim upperBound As Integer
Dim lowerBound As Integer
lowerBound = LBound(array)
upperBound = UBound(array)
For i = lowerBound To upperBound
minimum = i
For j = i + 1 To upperBound
'Search for the smallest remaining item in the array
If array(j) < array(minimum) Then
'A smaller value has been found, remember the position in the array
minimum = j
End If
Next j
If minimum <> i Then
'Swap array Values
swapValue = array(minimum)
array(minimum) = array(i)
array(i) = swapValue
End If
Next i
End Sub
使用myArray调用此函数。
Dim numbers = New Integer() {3, 5, 200}
SortArray(numbers)
代码的作用:
1.找到数组中的最小元素。
2.在第一个pos中交换元素并找到最小的元素。现在最小的elemnet到达第一个位置。
3.重复上述两个步骤,列表中只有一个元素。(从进一步处理中丢弃的最小元素)
最终输出