FAQ по Visual Basic

Содержание / Начальные сведения о VB Поиск | Далее

§ 3.6. Сортировка данных

В этот статье я обращаюсь к операции, довольно часто выполняемой практической в любой программе — сортировке.

Обычно программисты реализуют один из двух алгоритмов — пузырьковая сортировка или сортировка выборкой. Оба достаточно простые, но зато очень тормозные. Гораздо предпочтительнее воспользоваться готовой реализацией более быстрого алгоритма, например, быстрой сортировки (quicksort).

Public Sub QuickSortVariantArray( _
	avarIn() As Variant, _
	ByVal intLowBound As Long, _
	ByVal intHighBound As Long)
    ' Comments  : Quicksorts the passed array of Variants
    ' Parameters: avarIn() - array of Variant that gets sorted
    '             intLowBound - low bound of array
    '             intHighBound - high bound of arrayM
    ' Returns   : Nothing
    ' Source    : Total VB SourceBook 6
    '
    Dim intX As Long
    Dim intY As Long
    Dim varMidBound As Variant
    Dim varTmp As Variant

    On Error GoTo PROC_ERR

    ' If there is data to sort
    If intHighBound > intLowBound Then
        ' Calculate the value of the middle array element
        varMidBound = avarIn((intLowBound + intHighBound) \ 2)
        intX = intLowBound
        intY = intHighBound

        ' Split the array into halves
        Do While intX <= intY
            If avarIn(intX) >= varMidBound And _
               avarIn(intY) <= varMidBound _
            Then
                varTmp = avarIn(intX)
                avarIn(intX) = avarIn(intY)
                avarIn(intY) = varTmp
                intX = intX + 1
                intY = intY - 1
            Else
                If avarIn(intX) < varMidBound Then
                    intX = intX + 1
                End If
                If avarIn(intY) > varMidBound Then
                    intY = intY - 1
                End If
            End If
        Loop

        ' Sort the lower half of the array
        QuickSortVariantArray avarIn(), intLowBound, intY

        ' Sort the upper half of the array
        QuickSortVariantArray avarIn(), intX, intHighBound
    End If

PROC_EXIT:
    Exit Sub

PROC_ERR:
    MsgBox "Error: " & Err.Number & ". " & Err.Description, , _
        "QuickSortVariantArray"
    Resume PROC_EXIT
End Sub

Если ваш массив имеет тип, отличный от Variant, например, String, создайте копию этой процедуры и измените в ней все типы с Variant на тот, что вам нужен.

Автор:
Master

Предыдущий раздел Следующий раздел

© 2004. При цитировании, пожалуйста, не забудьте поставить ссылку на оригинальную страницу.