|
Sub CombSort(arr As Variant, Optional numEls As Variant, Optional descending
As Boolean) Dim value As Variant Dim index As Long Dim firstItem As Long Dim Gap As Long Dim Swap As Boolean ' account for optional arguments If IsMissing(numEls) Then numEls = UBound(arr) firstItem = LBound(arr) Gap = numEls - firstItem + 1 Do While (Gap > 1 Or Swap) ' divide Gap by 1.3 - the author says it's an empirical value Gap = (10 * Gap) \ 13 ' another empirical value If (Gap = 9 Or Gap = 10) Then Gap = 11 Swap = False For index = firstItem To numEls - Gap value = arr(index) If (value > arr(index + Gap)) Xor descending Then ' if the items are not in order, swap them arr(index) = arr(index + Gap) arr(index + Gap) = value Swap = True End If Next Loop End Sub |