Главная » Статьи » Программирование » Скрипты

Быстрая сортировка массивов на VBScript

Быстрая сортировка массивов на VBScript

Вообще на VBS она сильно быстрой не будет :). Но ниже приведена рабочая реализация. Подсмотрено на RSDN и слегка доработано.

'###############################################################################################################################
' Реализация алгоритма быстрой сортировки. На основе http://www.rsdn.ru/forum/src/312064.1.aspx
'###############################################################################################################################

Option Explicit
'###############################################################################################################################
' Процедура быстрой сортировки массива (QuickSort)
' [in,out] aArray - подлежащий сортировке массив
' [in] aCompareFunction - функция-делегат для вычисления позиции элемента в результирующем массиве
' должна иметь прототип SomeFunction(a, b) = <0, 0, >0 для сравнения a, b
Sub QuickSortArray(ByRef aArray, aCompare)

 If Not IsArray(aArray) Then Exit Sub
 
 If (UBound(aArray) < LBound(aArray)) Then Exit Sub
 
 ' А теперь отсортируем
 QuickSortArrayPartial aArray, _
 aCompare, _
 LBound(aArray), _
 UBound(aArray), _
 IsObject( aArray( LBound( aArray)))
End Sub

'###############################################################################################################################
' Процедура быстрой сортировки части массива (QuickSort)
' [in,out] aArray - подлежащий сортировке массив
' [in] aCompareFunction - функция-делегат для вычисления позиции элемента в результирующем массиве
' должна иметь прототип SomeFunction(a, b) = <0, 0, >0 для сравнения a, b
' [in] nLeft - первый элемент границ сортировки
' [in] nRight - последний элемент границ сортировки
' [in] bIsObject - признак работы с массивом объектов
Sub QuickSortArrayPartial(ByRef aArray, aCompare, nLeft, nRight, bIsObject)
 
 Dim I, J, P, L, R, T
 
 L = nLeft
 R = nRight
 
 Do
 I = L
 J = R
 If bIsObject Then
 Set P = aArray((L + R) \ 2)
 Else
 P = aArray((L + R) \ 2)
 End If
 
 Do
 While (aCompare(aArray(I), P) < 0)
 I = I + 1
 Wend
 While (aCompare(aArray(J), P) > 0)
 J = J - 1
 Wend
 
 If I <= J Then
 If bIsObject Then
 Set T = aArray(I)
 Set aArray(I) = aArray(J)
 Set aArray(J) = T
 Set T = Nothing
 Else
 T = aArray(I)
 aArray(I) = aArray(J)
 aArray(J) = T
 T = Null
 End If
 I = I + 1
 J = J - 1
 End If
 Loop Until I > J
 
 If L < J Then 
 QuickSortArrayPartial aArray, aCompare, L, J, bIsObject
 End If 
 L = I
 Loop Until I >= R
End Sub

'###############################################################################################################################
' Функция - делегат для сравнения произвольных скалярных данных
Function Cmp_Any(a, b)
 If a < b Then
 Cmp_Any = -1
 ElseIf a > b Then
 Cmp_Any = 1
 Else
 Cmp_Any = 0
 End If 
End Function

'###############################################################################################################################
' Функция - делегат для сравнения произвольных строковых данных
Function Cmp_String(a, b)
 Cmp_String = StrComp(a, b)
End Function

Пример-продолжение

Dim A, S, X

A = Array(2, 3, 2, 1)

Call QuickSortArray(A, GetRef("Cmp_Any"))

For Each X in A
 S = S & X & "; "
Next

MsgBox(S)


Источник: http://www.rsdn.ru/forum/src/312064.1.aspx
Категория: Скрипты | Добавил: alexeevd (26.02.2012)
Просмотров: 1078 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *: