Я недавно разрабатываю довольно большой проект, и одной из частей является эффективная сортировка. Поскольку мне никогда не приходилось сортировать что-либо такого масштаба с помощью 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: Если требуется больше данных, пожалуйста, попросите об этом в комментариях.