Сортировка массива [QuickSort] все еще медленнее, чем собственный Range.Sort - PullRequest
1 голос
/ 27 апреля 2020

Я недавно разрабатываю довольно большой проект, и одной из частей является эффективная сортировка. Поскольку мне никогда не приходилось сортировать что-либо такого масштаба с помощью VBA, я не знал, что это будет так сложно.

Я создал образец, создав серию чисел от 1 до 500. Затем я изменил их с помощью 'custom формат ', чтобы быть похожим на "000000", означающее, что 1 - 000001, 15 - 000015, 1537 - 001537 и c. затем я добавил две буквы перед всеми этими, скажем, XY.

Мой образец выглядит так:

XY000001
XY000002
.
.
XY000500

Наконец, я заполнил этот образец вниз от строки 1 до строки 100 000, чтобы иметь ( 100 000/500) 200 таких образцов обратите внимание, что образец идет от 1 до 500, а затем повторяется снова от 1 до 500 . (Это похоже на тот тип данных, с которым я бы хотел работать, однако в моем примере у меня может быть любое число от XY000001 до XY999999).

Теперь я хочу отсортировать образец как как можно быстрее.

Я прошел множество различных испытаний, в одном из которых использовался код QuickSort, который я нашел где-то в Интернете.

Option Explicit

Sub QuickSort(a As Variant, aLB As Long, aUB As Long)

Dim vPivot  As Variant
Dim vSwap   As Variant
Dim LO  As Long
Dim HI   As Long


    LO = aLB
    HI = aUB
    vPivot = a((aLB + aUB) / 2, 1)

    While (LO <= HI) 'divide

        While (a(LO, 1) < vPivot And LO < aUB)
            LO = LO + 1
        Wend

        While (vPivot < a(HI, 1) And HI > aLB)
            HI = HI - 1
        Wend

        If (LO <= HI) Then

            vSwap = a(LO, 1)
            a(LO, 1) = a(HI, 1)
            a(HI, 1) = vSwap
            LO = LO + 1
            HI = HI - 1

        End If

    Wend

    If (aLB < HI) Then QuickSort a, aLB, HI

    If (LO < aUB) Then QuickSort a, LO, aUB

End Sub

Теперь приходит забавно часть - приведенный выше код должен быть очень быстрым.

Угадайте, что, требуется код QuickSort около 450-600 мс на моем компьютере, чтобы отсортировать образец данные, которые я описал выше, , в то время как для простого Range.Sort требуется всего около 60-70 мс (имейте в виду, что Range.Sort также «происходит» непосредственно на рабочем листе, пока QuickSort выполняет операции в памяти с массив, так что QuickSort в теории должен быть намного быстрее).

Я обычно склонен делать все на массивах в VBA, так как я знаю, сколько производительности набирает код, однако в этом случае я озадачен.

Я не могу понять, как родной Range.Sort может быть настолько быстрым. То же самое касается простого нажатия на кнопку «Сортировать AZ» в Excel - кажется, это очень быстро.

Мне интересно, что я что-то упускаю или люди на самом деле НЕ сортируют массивы?

PS: Если требуется больше данных, пожалуйста, попросите об этом в комментариях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...