|
Sub QuickSort(arr As Variant, Optional numEls As Variant, _
Optional descending As Boolean) Dim value As Variant, temp As Variant Dim sp As Integer Dim leftStk(32) As Long, rightStk(32) As Long Dim leftNdx As Long, rightNdx As Long Dim i As Long, j As Long ' account for optional arguments If IsMissing(numEls) Then numEls = UBound(arr) ' init pointers leftNdx = LBound(arr) rightNdx = numEls ' init stack sp = 1 leftStk(sp) = leftNdx rightStk(sp) = rightNdx Do If rightNdx > leftNdx Then value = arr(rightNdx) i = leftNdx - 1 j = rightNdx ' find the pivot item If descending Then Do Do: i = i + 1: Loop Until arr(i) <= value Do: j = j - 1: Loop Until j = leftNdx Or arr(j) >= value temp = arr(i) arr(i) = arr(j) arr(j) = temp Loop Until j <= i Else Do Do: i = i + 1: Loop Until arr(i) >= value Do: j = j - 1: Loop Until j = leftNdx Or arr(j) <= value temp = arr(i) arr(i) = arr(j) arr(j) = temp Loop Until j <= i End If ' swap found items temp = arr(j) arr(j) = arr(i) arr(i) = arr(rightNdx) arr(rightNdx) = temp ' push on the stack the pair of pointers that differ most sp = sp + 1 If (i - leftNdx) > (rightNdx - i) Then leftStk(sp) = leftNdx rightStk(sp) = i - 1 leftNdx = i + 1 Else leftStk(sp) = i + 1 rightStk(sp) = rightNdx rightNdx = i - 1 End If Else ' pop a new pair of pointers off the stacks leftNdx = leftStk(sp) rightNdx = rightStk(sp) sp = sp - 1 If sp = 0 Then Exit Do End If Loop End Sub |