CombSort



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


(combsort.html)- by Paolo Puglisi - Modifica del 25/3/2019