Я скопировал приведенную ниже реализацию быстрой сортировки из Wikibooks (Автор: Джон Грин).Я добавил Маленькая обертка, чтобы проверить это.Однако выполнение завершается неудачно с ошибкой индекса вне привязки, которая, кажется, не имеет смысла.
Прямой ввод Показывает в точке останова следующий правильный вывод:
?UBound(VA_array)
7
?V_Low1
1
?V_High1
7
?(V_Low1 + V_High1) / 2
4
?dbgEchoVarType(VarType(VA_array))
vbArray: Array of type vbVariant: (used only with array of variants)
Последний являетсяпросто функция, чтобы превратить VarType в строку.Тип выглядит нормально.
Public Sub sortThis()
Dim r() As Variant
r = Selection.Value2
Debug.Print ("Selected Range: " & getRngAddress(Selection))
Call QuickSort(r)
Selection.Value2 = r
End Sub
Sub QuickSort(ByRef VA_array(), Optional V_Low1, Optional V_High1)
Dim V_Low2 As Long, V_High2 As Long
Dim V_val1 As Variant, V_val2 As Variant
If IsMissing(V_Low1) Then V_Low1 = LBound(VA_array, 1)
If IsMissing(V_High1) Then V_High1 = UBound(VA_array, 1)
Debug.Print ("qs: Low1: " & V_Low1 & " / V_High1: " & V_High1)
V_Low2 = V_Low1
V_High2 = V_High1
V_val1 = VA_array((V_Low1 + V_High1) / 2)
While (V_Low2 <= V_High2)
While (VA_array(V_Low2) < V_val1 And V_Low2 < V_High1)
V_Low2 = V_Low2 + 1
Wend
While (VA_array(V_High2) > V_val1 And V_High2 > V_Low1)
V_High2 = V_High2 - 1
Wend
If (V_Low2 <= V_High2) Then
V_val2 = VA_array(V_Low2)
VA_array(V_Low2) = VA_array(V_High2)
VA_array(V_High2) = V_val2
V_Low2 = V_Low2 + 1
V_High2 = V_High2 - 1
End If
Wend
If (V_High2 > V_Low1) Then Call QuickSort(VA_array, V_Low1, V_High2)
If (V_Low2 < V_High1) Then Call QuickSort(VA_array, V_Low2, V_High1)
End Sub
Выделение содержит 7 ячеек в одном столбце, каждый из которых содержит постоянное целочисленное значение.
Я не понимаю, почему 4 считается индексом вне границы.Отладочное сообщение в приведенном выше коде показывает, что код не выполняется при первом вызове, а не при любых последующих вызовах.
Что не так?