How to sort a collection in Visual Basic using HeapSort
HeapSort is a simple and relatively fast sorting algorithm. The routine below uses the HeapSort algorithm to sort a VB collection object.
For more information about the HeapSort algorithm: NIST Dictionary of Algorithms and Data Structures, Wikipedia
Download file: HeapSortCollection.zip
' This routine uses the "heap sort" algorithm to sort a VB collection.
' It returns the sorted collection.
' Author: Christian d'Heureuse (www.source-code.biz)
Public Function SortCollection(ByVal c As Collection) As Collection
Dim n As Long: n = c.Count
If n = 0 Then Set SortCollection = New Collection: Exit Function
ReDim Index(0 To n - 1) As Long ' allocate index array
Dim i As Long, m As Long
For i = 0 To n - 1: Index(i) = i + 1: Next ' fill index array
For i = n \ 2 - 1 To 0 Step -1 ' generate ordered heap
Heapify c, Index, i, n
Next
For m = n To 2 Step -1 ' sort the index array
Exchange Index, 0, m - 1 ' move highest element to top
Heapify c, Index, 0, m - 1
Next
Dim c2 As New Collection
For i = 0 To n - 1: c2.Add c.Item(Index(i)): Next ' fill output collection
Set SortCollection = c2
End Function
Private Sub Heapify(ByVal c As Collection, Index() As Long, ByVal i1 As Long, ByVal n As Long)
' Heap order rule: a[i] >= a[2*i+1] and a[i] >= a[2*i+2]
Dim nDiv2 As Long: nDiv2 = n \ 2
Dim i As Long: i = i1
Do While i < nDiv2
Dim k As Long: k = 2 * i + 1
If k + 1 < n Then
If c.Item(Index(k)) < c.Item(Index(k + 1)) Then k = k + 1
End If
If c.Item(Index(i)) >= c.Item(Index(k)) Then Exit Do
Exchange Index, i, k
i = k
Loop
End Sub
Private Sub Exchange(Index() As Long, ByVal i As Long, ByVal j As Long)
Dim Temp As Long: Temp = Index(i)
Index(i) = Index(j)
Index(j) = Temp
End Sub
Example for using the SortCollection function
Public Sub Example1()
Dim c As New Collection
c.Add "Pear"
c.Add "Apple"
c.Add "Cherry"
c.Add "Prune"
c.Add "Peach"
Dim c2 As Collection
Set c2 = SortCollection(c)
Dim s
For Each s In c2
Debug.Print s
Next
End Sub
The following routines can be used to test the SortCollection routine:
' Test routine for the SortCollection routine.
' Uses random numbers to verify the sort algorithm.
Public Sub TestSortCollection()
Debug.Print "Start"
Dim i
For i = 1 To 1000
Dim c As Collection: Set c = GenerateCollectionWithRandomValues()
Dim c2 As Collection: Set c2 = SortCollection(c)
VerifyCollectionIsSorted c2
Next
Debug.Print "OK"
End Sub
Private Function GenerateCollectionWithRandomValues() As Collection
Dim n As Long: n = 1 + Rnd * 100
Dim c As New Collection
Dim i As Long
For i = 1 To n
c.Add CLng(Rnd * 1000)
Next
Set GenerateCollectionWithRandomValues = c
End Function
Private Sub VerifyCollectionIsSorted(ByVal c As Collection)
Dim i As Long
For i = 1 To c.Count - 1
If c.Item(i) > c.Item(i + 1) Then
Err.Raise vbObjectError, , "Collection is not sorted!"
End If
Next
End Sub
Author: Christian d'Heureuse (www.source-code.biz, www.inventec.ch/chdh)
License: Free / LGPL
Index