Private Declare Function GetTickCount Lib "kernel32.dll" () As Long
Function SortArrayScript(SerStr As String) As String
SerStr = "('" & SerStr & "').split(',').sort(function(a,b){return (a-b)}).join(',')" ' & ".reverse()" 'if DESC
With CreateObject("MSScriptControl.ScriptControl")
.Language = "JavaScript"
SortArrayScript = .Eval(SerStr)
End With
End Function
Function SortArraySystem(SerStr As String) As String
Dim str As String, Arr, i As Long
Arr = Split(SerStr, ",")
With CreateObject("System.Collections.ArrayList")
For i = 0 To UBound(Arr)
.Add CLng(Arr(i))
Next
.Sort: Arr = .ToArray
End With
SortArraySystem = Join(Arr, "-")
End Function
Public Sub QuickSort1DArray(Arr, iLo As Long, iHi As Long, ByVal sortAtoZ As Boolean)
' Arr laĚ maŇng câĚn săěp xęěp
' sortAtoZ xaěc điňnh caěch săěp xęěp tăng hay giaŇm
' iLo laĚ câňn dýőěi cuŇa maŇng Arr, iHi laĚ câňn tręn cuŇa maŇng Arr
Dim Lo As Long, Hi As Long, iMid, DoChange As Boolean, s
Do
Lo = iLo
Hi = iHi
iMid = Arr((Lo + Hi) \ 2)
Do
If sortAtoZ Then
Do While Arr(Lo) < iMid
Lo = Lo + 1
Loop
Do While Arr(Hi) > iMid
Hi = Hi - 1
Loop
Else
Do While Arr(Lo) > iMid
Lo = Lo + 1
Loop
Do While Arr(Hi) < iMid
Hi = Hi - 1
Loop
End If
If Lo <= Hi Then
If sortAtoZ Then
DoChange = (Arr(Lo) > Arr(Hi))
Else
DoChange = (Arr(Lo) < Arr(Hi))
End If
If DoChange Then
s = Arr(Lo)
Arr(Lo) = Arr(Hi)
Arr(Hi) = s
End If
Lo = Lo + 1
Hi = Hi - 1
End If
Loop Until Lo > Hi
If Hi > iLo Then QuickSort1DArray Arr, iLo, Hi, sortAtoZ
iLo = Lo
Loop Until Lo >= iHi
End Sub
Sub test()
Dim s As String, a As String, t As Double, k As Long, Arr() As Long, tmp, n As Long
t = GetTickCount
For k = 1 To 60000
a = SortArrayScript("1,9,1,2,1,8,16,4,3,11,11,9,5,11,12,13,16,15,20,15,14,10,7,20")
Next k
Debug.Print "SortArrayScript:: " & (GetTickCount - t) / 1000 & " " & a
t = GetTickCount
For k = 1 To 60000
a = SortArraySystem("1,9,1,2,1,8,16,4,3,11,11,9,5,11,12,13,16,15,20,15,14,10,7,20")
Next k
Debug.Print "SortArraySystem: " & (GetTickCount - t) / 1000 & " " & a
t = GetTickCount
For k = 1 To 60000
a = ""
tmp = Split("1,9,1,2,1,8,16,4,3,11,11,9,5,11,12,13,16,15,20,15,14,10,7,20", ",")
ReDim Arr(LBound(tmp) To UBound(tmp))
For n = LBound(tmp) To UBound(tmp)
Arr(n) = tmp(n)
Next n
QuickSort1DArray Arr, LBound(Arr), UBound(Arr), True
For n = LBound(tmp) To UBound(tmp)
a = a & Arr(n) & "-"
Next n
a = Left(a, Len(a) - 1)
Next k
Debug.Print "QuickSort1DArray: " & (GetTickCount - t) / 1000 & " " & a
End Sub