none
How To Change QuickSort Ascending To Descending

    Question

  • I am using a quicksort algorithm for listing information in ascending order.  How would I change it to list the items in descending order.  The site I was at said to switch the comparison operators but that doesn't seem to work.  Here is the code for what I have :

        'This function sorts the particular list box using the Quick Sort algorithm [ASCENDING]
        Private Sub Sort_List_Boxes_Ascending(ByRef vArray() As String, ByVal inLow As Integer, ByVal inHi As Integer)
            Dim pivot As Object
            Dim tmpSwap As Object
            Dim tmpLow As Long
            Dim tmpHi As Long
    
            tmpLow = inLow
            tmpHi = inHi
    
            pivot = vArray((inLow + inHi) \ 2)
    
            While (tmpLow <= tmpHi)
    
                While (vArray(tmpLow) < pivot And tmpLow < inHi)
                    tmpLow = tmpLow + 1
                End While
    
                While (pivot < vArray(tmpHi) And tmpHi > inLow)
                    tmpHi = tmpHi - 1
                End While
    
                If (tmpLow <= tmpHi) Then
                    tmpSwap = vArray(tmpLow)
                    vArray(tmpLow) = vArray(tmpHi)
                    vArray(tmpHi) = tmpSwap
                    tmpLow = tmpLow + 1
                    tmpHi = tmpHi - 1
                End If
    
            End While
    
            If (inLow < tmpHi) Then Sort_List_Boxes_Ascending(vArray, inLow, tmpHi)
            If (tmpLow < inHi) Then Sort_List_Boxes_Ascending(vArray, tmpLow, inHi)
    
        End Sub
    Thanks!
    Friday, July 24, 2009 5:07 PM

Answers

  • Well, first thing - Are you aware that Array.Sort uses the QuickSort to do it's sorting?  So, there is no real reason to implement QuickSort at all for your particular operation.

    Now assuming your in VB2008, you can quite simply do as you ask:

    Option Explicit On
    Option Strict On
    
    Module Module1
    
        Sub Main()
            Dim a() As String = {"D", "A", "C", "B"}
    
            ' assending
            Array.Sort(a)
            PrintArray(a)
    
            'descending
            Array.Sort(a, Function(x, y) x.CompareTo(y) * -1)
            PrintArray(a)
        End Sub
    
        Private Sub PrintArray(ByVal a() As String)
            Console.WriteLine(String.Join(", ", a))
        End Sub
    End Module
    
    HTH

    Tom Shelton
    • Marked as answer by NuNn DaDdY Friday, July 24, 2009 8:05 PM
    • Unmarked as answer by NuNn DaDdY Friday, July 24, 2009 8:06 PM
    • Marked as answer by NuNn DaDdY Friday, July 24, 2009 8:07 PM
    Friday, July 24, 2009 5:50 PM

All replies

  • Well, first thing - Are you aware that Array.Sort uses the QuickSort to do it's sorting?  So, there is no real reason to implement QuickSort at all for your particular operation.

    Now assuming your in VB2008, you can quite simply do as you ask:

    Option Explicit On
    Option Strict On
    
    Module Module1
    
        Sub Main()
            Dim a() As String = {"D", "A", "C", "B"}
    
            ' assending
            Array.Sort(a)
            PrintArray(a)
    
            'descending
            Array.Sort(a, Function(x, y) x.CompareTo(y) * -1)
            PrintArray(a)
        End Sub
    
        Private Sub PrintArray(ByVal a() As String)
            Console.WriteLine(String.Join(", ", a))
        End Sub
    End Module
    
    HTH

    Tom Shelton
    • Marked as answer by NuNn DaDdY Friday, July 24, 2009 8:05 PM
    • Unmarked as answer by NuNn DaDdY Friday, July 24, 2009 8:06 PM
    • Marked as answer by NuNn DaDdY Friday, July 24, 2009 8:07 PM
    Friday, July 24, 2009 5:50 PM
  • I am having issues with your solution as I keep receiving "Item cannot be null when I try adding my array back to the listbox" .

    Could you/someone direct me on reversing the sort order of the quicksort

    *CORRECTION*  You were right Tom, my apologies.  An error in my code on my part.  Thank you very much!

    But if someone could still provide the descending info that would be appreciated
    • Edited by NuNn DaDdY Friday, July 24, 2009 8:07 PM
    Friday, July 24, 2009 7:50 PM