实现插入排序时出现越界错误

Out of Bounds error when Implementing an insertion sort

好像VB.NET对布尔条件While j >= 1 And Card(j - 1) > NextCard的两边都进行了求值,这当然会导致越界错误。

我编写的其他语言会先评估左边的条件,然后在第二个条件导致程序崩溃之前退出循环。

任何人都可以看到一个明显的解决方案,还是我只需要将算法变成一团乱麻?

Sub Main()
    Dim card() As Integer = {7, 4, 6, 8, 1, 5}
    Insertion_Sort(card)
    For Each item In card
        Console.WriteLine(item)
    Next
End Sub

Sub Insertion_Sort(ByRef Card() As Integer)
    Dim NextCard
    Dim j As Integer

    For i = 1 To Card.Length - 1
        NextCard = Card(i)
        j = i
        While j >= 1 And Card(j - 1) > NextCard
            Card(j) = Card(j - 1)
            j -= 1
        End While
        Card(j) = NextCard
    Next
End Sub

正如 Capellan 所建议的,可以使用 AndAlso 关键字代替 And 来完成短路评估:

While j >= 1 AndAlso Card(j - 1) > NextCard
     Card(j) = Card(j - 1)
     j -= 1
End While

这导致 VB.Net 首先计算第一个表达式,然后,只有当第一个表达式为真时,它才计算第二个表达式。

我建议您也查看 MSDN 页面:https://msdn.microsoft.com/en-us/library/cb8x3kfz.aspx