Multidimensional Array sorted on 3 of the dimensions (can be either 0 or 1 based):   Return to List

' To call the procedure, you would use a command such as:
MyQuickSort_Tri aryTemp(), 1, UBound(aryTemp(), 2), 2, 1, 3 True' Sorted on 2nd dim first, 1, 3

Private Sub MyQuickSort_Tri(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 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)
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))
            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))
            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))
            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))
            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_Tri SortArray, First, High, PrimeSort, SecSort, TriSort, Ascending
If (Low < Last) Then MyQuickSort_Tri SortArray, Low, Last, PrimeSort, SecSort, TriSort, Ascending
End Sub

See also:
Array Converted to Delimited Text String
Building an Array of Filenames (after browse)
Delimited Text to an Array (similar to Split())
Determining Upper & Lower Array Bounds
Erasing an Array (removing all the elements)
Feed an Array into a New Document (del dupes)
Filename Array from Active Directory
QuickSort routine
QuickSort Single Dimension
QuickSort (Fast!!) (Multidimensional on 2 dims)
Removing Duplicates from an Array
SQL Query Results placed in an Array
Using Split() function to create Array



Note to Webmaster