实现插入排序时出现越界错误
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
好像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