devxlogo

QuickSort – Sort Arrays using the QuickSort Algorithm

QuickSort – Sort Arrays using the QuickSort Algorithm

' QuickSort an array of any type' QuickSort is especially convenient with large arrays (>1,000' items) that contains items in random order. Its performance' quickly degrades if the array is already almost sorted. (There are' variations of the QuickSort algorithm that work good with ' nearly-sorted arrays, though, but this routine doesn't use them.)'' NUMELS is the index of the last item to be sorted, and is' useful if the array is only partially filled.'' Works with any kind of array, except UDTs and fixed-length' strings, and including objects if your are sorting on their' default property. String are sorted in case-sensitive mode.'' You can write faster procedures if you modify the first two lines' to account for a specific data type, eg.' Sub QuickSortS(arr() As Single, Optional numEls As Variant,'  '     Optional descending As Boolean)'   Dim value As Single, temp As SingleSub 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    LoopEnd Sub

See also  Professionalism Starts in Your Inbox: Keys to Presenting Your Best Self in Email
devxblackblue

About Our Editorial Process

At DevX, we’re dedicated to tech entrepreneurship. Our team closely follows industry shifts, new products, AI breakthroughs, technology trends, and funding announcements. Articles undergo thorough editing to ensure accuracy and clarity, reflecting DevX’s style and supporting entrepreneurs in the tech sphere.

See our full editorial policy.

About Our Journalist