Visual Basic选择排序"索引超出范围"

时间:2016-03-22 22:34:59

标签: arrays vb.net sorting

我最近一直试图在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

正如我所说,降序排序没有任何问题,但升序排序正在给我错误。有人能告诉我如何解决这个问题吗?谢谢:))

1 个答案:

答案 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.重复上述两个步骤,列表中只有一个元素。(从进一步处理中丢弃的最小元素)

最终输出

enter image description here