Multi-Dimensional QuickSort on 4 Dimensions:   Return to List

' Sample array
aryTest(1,1) = "Jones, Jim"' 1st dimension of 1st record
aryTest(2,1) = "Virginia"' 2nd dimension of 1st record
aryTest(3,1) = "25"' 3rd dimension of 1st record
aryTest(4,1) = "Single"' 4th dimension of 1st record
aryTest(5,1) = "Brown"' 5th dimension of 1st record
aryTest(1,2) = "Smith, Mary"' 1st dimension of 2nd record
aryTest(2,2) = "North Carolina"' 2nd dimension of 2nd record
aryTest(3,2) = "36"' 3rd dimension of 2nd record
aryTest(4,2) = "Divorced"' 4th dimension of 2nd record
aryTest(5,2) = "Blonde"' 5th dimension of 2nd record
aryTest(1,3) = "Johnson, Steve"' 1st dimension of 3rd record
aryTest(2,3) = "Mississippi"' 2nd dimension of 3rd record
aryTest(3,3) = "45"' 3rd dimension of 3rd record
aryTest(4,3) = "Single"' 4th dimension of 3rd record
aryTest(5,3) = "Brown"' 5th dimension of 3rd record


' Command which calls quicksort routine below and sorts 3rd, 1st, 2nd, and 4th dimensions
MyQuickSort_Single aryTest(), 1, UBound(aryTest(),2), 3, 1, 2, 4, True


' The called quicksort subroutine (array passed By Reference -- so array itself is modified
Private Sub MyQuickSort_Quad(ByRef SortArray As Variant, _
            ByVal First As Long, ByVal Last As Long, _
            ByVal PrimeSort As Integer, ByVal SecSort As Integer, _
            ByVal TriSort As Integer, ByVal QuadSort as Integer, _
            ByVal Ascending as Boolean)
Dim Low As Long, High As Long
Dim Temp As Variant, List_Separator As Variant
Dim TempArray() As Variant
ReDim TempArray(UBound(SortArray, 1))
Low = First
High = Last
List_Separator1 = SortArray(PrimeSort, (First + Last) / 2)
List_Separator2 = SortArray(SecSort, (First + Last) / 2)
List_Separator3 = SortArray(TriSort, (First + Last) / 2)
List_Separator4 = SortArray(QuadSort, (First + Last) / 2)
Do
    If Ascending = True Then
        Do While (SortArray(PrimeSort, Low) < List_Separator1) Or _
            ((SortArray(PrimeSort, Low) = List_Separator1) And (SortArray(SecSort, Low) < List_Separator2)) Or _
            ((SortArray(PrimeSort, Low) = List_Separator1) And (SortArray(SecSort, Low) = List_Separator2) And _
            (SortArray(TriSort, Low) < List_Separator3)) Or _
            ((SortArray(PrimeSort, Low) = List_Separator1) And (SortArray(SecSort, Low) = List_Separator2) And _
            (SortArray(TriSort, Low) = List_Separator3) And (SortArray(QuadSort, Low) < List_Separator4))
            Low = Low + 1
        Loop
        Do While (SortArray(PrimeSort, High) > List_Separator1) Or _
            ((SortArray(PrimeSort, High) = List_Separator1) And (SortArray(SecSort, High) > List_Separator2)) Or _
            ((SortArray(PrimeSort, High) = List_Separator1) And (SortArray(SecSort, High) = List_Separator2) And _
            (SortArray(TriSort, High) > List_Separator3)) Or _
            ((SortArray(PrimeSort, High) = List_Separator1) And (SortArray(SecSort, High) = List_Separator2) And _
            (SortArray(TriSort, High) = List_Separator3) And (SortArray(QuadSort, High) > List_Separator4))
            High = High - 1
        Loop
    Else
        Do While (SortArray(PrimeSort, Low) > List_Separator1) Or _
            ((SortArray(PrimeSort, Low) = List_Separator1) And (SortArray(SecSort, Low) > List_Separator2)) Or _
            ((SortArray(PrimeSort, Low) = List_Separator1) And (SortArray(SecSort, Low) = List_Separator2) And _
            (SortArray(TriSort, Low) > List_Separator3)) Or _
            ((SortArray(PrimeSort, Low) = List_Separator1) And (SortArray(SecSort, Low) = List_Separator2) And _
            (SortArray(TriSort, Low) = List_Separator3) And (SortArray(QuadSort, Low) > List_Separator4))
            Low = Low + 1
        Loop
        Do While (SortArray(PrimeSort, High) < List_Separator1) Or _
            ((SortArray(PrimeSort, High) = List_Separator1) And (SortArray(SecSort, High) < List_Separator2)) Or _
            ((SortArray(PrimeSort, High) = List_Separator1) And (SortArray(SecSort, High) = List_Separator2) And _
            (SortArray(TriSort, High) < List_Separator3)) Or _
            ((SortArray(PrimeSort, High) = List_Separator1) And (SortArray(SecSort, High) = List_Separator2) And _
            (SortArray(TriSort, High) = List_Separator3) And (SortArray(QuadSort, High) < List_Separator4))
            High = High - 1
        Loop
    End If
    If (Low <= High) Then
        For i = LBound(SortArray, 1) To UBound(SortArray, 1)        ' Lower bounds indicates lowest dimension
            TempArray(i) = SortArray(i, Low)
        Next
        For i = LBound(SortArray, 1) To UBound(SortArray, 1)
            SortArray(i, Low) = SortArray(i, High)
        Next
        For i = LBound(SortArray, 1) To UBound(SortArray, 1)
            SortArray(i, High) = TempArray(i)
        Next
        Low = Low + 1
        High = High - 1
    End If
Loop While (Low <= High)
If (First < High) Then MyQuickSort_Quad SortArray, First, High, PrimeSort, SecSort, TriSort, QuadSort, Ascending
If (Low < Last) Then MyQuickSort_Quad SortArray, Low, Last, PrimeSort, SecSort, TriSort, QuadSort, Ascending
End Sub



Note to Webmaster