VBA выстраивают функцию вида?

79
задан Csaba 16 October 2018 в 23:43
поделиться

2 ответа

Смотрят здесь : Редактирование
: источник, на который ссылаются (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 здесь .)

93
ответ дан June7 24 November 2019 в 10:14
поделиться

Объяснение на немецком, но коде является хорошо протестированной оперативной реализацией:

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))
10
ответ дан Konrad Rudolph 24 November 2019 в 10:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: