【问题标题】:Visual Basic Selection Sort "Index out of range"Visual Basic 选择排序“索引超出范围”
【发布时间】:2016-07-10 01:22:01
【问题描述】:

我最近一直在尝试在 Visual Basic 中创建一个选择排序程序。我已经设法让它将数组中的整数排序为降序但是,当我尝试使用相同的方法让它将数组排序为升序时,它会成功但我会得到一个“索引出范围”错误。以下是我的代码:

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

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

【问题讨论】:

  • 您需要告诉我们您在哪一行收到错误。 data = data.OrderByDescending(Function(x) x).ToArray() 也是您所需要的。将OrderByDescending 更改为OrderBy 以进行升序
  • 哦,我的错,我收到“Dim minimumNumber As Integer = array(minpos)”的错误。不幸的是,这个程序用于分配,因此需要使用选择排序方法来完成:/跨度>
  • firstI &gt;= LBound(array) 始终为 True,因此您永远不会退出循环...一旦超过 2,索引超出范围。除非您出于特定原因构建自己的排序例程,否则您应该按照 Plutonix 的建议进行操作并使用内置的排序功能。
  • 你知道我可以解决这个问题的方法吗?

标签: arrays vb.net sorting


【解决方案1】:

如果你不使用内置的order by,要应用选择排序,那么你必须正确定义排序算法。

您在使用 while 循环时实际遇到的问题永远不会结束,因此始终检查为真。我已将其转换为 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来到第一个pos。

3.重复以上两步,列表少一个元素。(从进一步处理中丢弃的最小元素)

最终输出

【讨论】:

    猜你喜欢
    • 2012-10-09
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    相关资源
    最近更新 更多