Quick Sort

Quick Sort uses a 'divide and conquer' strategy to divide a list into two sub-lists.

Sub TestSort() 
Dim avTesting() As Variant
   avTesting = Array(45, 30, 25, 15, 10, 5, 40, 20, 35, 50)
   Call Array_QuickSort(avTesting)
   Stop
End Sub
Public Sub Array_QuickSort(ByRef vArrayName As Variant, _ 
                  Optional ByVal lLower As Long = -1, _
                  Optional ByVal lUpper As Long = -1)
                  
Dim vmiddlevalue As Variant
Dim lmiddle As Long
Dim lrowlower As Long
Dim lrowupper As Long
Dim stemp As String

   If IsEmpty(vArrayName) = True Then Exit Sub
   If lLower = -1 Then lLower = LBound(vArrayName, 1)
   If lUpper = -1 Then lUpper = UBound(vArrayName, 1)

   If lLower < lUpper Then

'lmiddle = lLower
      lmiddle = (lLower + lUpper) / 2
'lmiddle = VBA.Int(lLower + VBA.Rnd * (lUpper - lLower + 1))

      vmiddlevalue = vArrayName(lmiddle)
      lrowlower = lLower
      lrowupper = lUpper
                        
      Do While lrowlower < lrowupper
         Do While (vArrayName(lrowupper) >= vmiddlevalue) And (lrowlower < lrowupper)
            lrowupper = lrowupper - 1
         Loop
         If (lrowlower <> lrowupper) Then
            stemp = vArrayName(lrowlower)
            vArrayName(lrowlower) = vArrayName(lrowupper)
            vArrayName(lrowupper) = stemp
            lrowlower = lrowlower + 1
         End If
         
         Do While (vArrayName(lrowlower) <= vmiddlevalue) And (lrowlower < lrowupper)
            lrowlower = lrowlower + 1
         Loop
         If (lrowlower <> lrowupper) Then
            stemp = vArrayName(lrowupper)
            vArrayName(lrowupper) = vArrayName(lrowlower)
            vArrayName(lrowlower) = stemp
            lrowupper = lrowupper - 1
         End If
      Loop
            
      vArrayName(lrowlower) = vmiddlevalue
      lmiddle = lrowlower
      lrowlower = lLower
      lrowupper = lUpper
      
      If (lrowlower < lmiddle) Then
         Call Array_QuickSort(vArrayName, lrowlower, lmiddle - 1)
      End If
      If (lrowupper > lmiddle) Then
         Call Array_QuickSort(vArrayName, lmiddle + 1, lrowupper)
      End If
   End If
End Sub

© 2020 Better Solutions Limited. All Rights Reserved. © 2020 Better Solutions Limited TopPrevNext