|
Sub ShellSort(arr As Variant, Optional lastEl As Variant, _
Optional descending As Boolean) Dim value As Variant Dim index As Long, index2 As Long Dim firstEl As Long Dim distance As Long Dim numEls As Long ' account for optional arguments If IsMissing(lastEl) Then lastEl = UBound(arr) firstEl = LBound(arr) numEls = lastEl - firstEl + 1 ' find the best value for distance Do distance = distance * 3 + 1 Loop Until distance > numEls Do distance = distance \ 3 For index = distance + firstEl To lastEl value = arr(index) index2 = index Do While (arr(index2 - distance) > value) Xor descending arr(index2) = arr(index2 - distance) index2 = index2 - distance If index2 - distance < firstEl Then Exit Do Loop arr(index2) = value Next Loop Until distance = 1 End Sub |