Смотрят здесь : Редактирование
: источник, на который ссылаются (allexperts.com) с тех пор закрылся, но здесь является соответствующим автор комментарии:
существует много алгоритмов, имеющихся в сети для сортировки. Самое универсальное и обычно самое быстрое алгоритм Quicksort . Ниже функция для него.
Вызов это просто путем передачи массива значений (строка или числовой; это не имеет значения) с Более низкая Граница массива (обычно
0
) и Верхняя Граница массива (т.е.UBound(myArray)
.)Пример :
Call QuickSort(myArray, 0, UBound(myArray))
то, Когда это сделано,
myArray
, будет отсортировано, и можно сделать то, что Вы хотите с ним.
(Источник: archive.org )
Public Sub QuickSort(vArray As Variant, inLow As Long, inHi As Long)
Dim pivot As Variant
Dim tmpSwap As Variant
Dim tmpLow As Long
Dim tmpHi As Long
tmpLow = inLow
tmpHi = inHi
pivot = vArray((inLow + inHi) \ 2)
While (tmpLow <= tmpHi)
While (vArray(tmpLow) < pivot And tmpLow < inHi)
tmpLow = tmpLow + 1
Wend
While (pivot < vArray(tmpHi) And tmpHi > inLow)
tmpHi = tmpHi - 1
Wend
If (tmpLow <= tmpHi) Then
tmpSwap = vArray(tmpLow)
vArray(tmpLow) = vArray(tmpHi)
vArray(tmpHi) = tmpSwap
tmpLow = tmpLow + 1
tmpHi = tmpHi - 1
End If
Wend
If (inLow < tmpHi) Then QuickSort vArray, inLow, tmpHi
If (tmpLow < inHi) Then QuickSort vArray, tmpLow, inHi
End Sub
Примечание, что это только работает с [1 125] одно-мерный (иначе "нормальный"?) массивы. (Существует рабочий многомерный массив QuickSort здесь .)
Объяснение на немецком, но коде является хорошо протестированной оперативной реализацией:
Private Sub QuickSort(ByRef Field() As String, ByVal LB As Long, ByVal UB As Long)
Dim P1 As Long, P2 As Long, Ref As String, TEMP As String
P1 = LB
P2 = UB
Ref = Field((P1 + P2) / 2)
Do
Do While (Field(P1) < Ref)
P1 = P1 + 1
Loop
Do While (Field(P2) > Ref)
P2 = P2 - 1
Loop
If P1 <= P2 Then
TEMP = Field(P1)
Field(P1) = Field(P2)
Field(P2) = TEMP
P1 = P1 + 1
P2 = P2 - 1
End If
Loop Until (P1 > P2)
If LB < P2 Then Call QuickSort(Field, LB, P2)
If P1 < UB Then Call QuickSort(Field, P1, UB)
End Sub
Вызванный как это:
Call QuickSort(MyArray, LBound(MyArray), UBound(MyArray))