クイックソートは平均的に最速のソート方法だが、運が悪いとすさまじく時間がかかったりする。まあ、その運の悪さが発生しないように工夫して実装されているようだが。その実装は、初見の人間を確実に混乱させる。
そこでコムソートだ。コムソートはクイックソートの2倍程度時間がかかるようだが、運に左右されず、ほぼ安定した速度を提供するようだ(クイックソート同様安定ソートではない)。なによりコードが難解でない。
ネット上でVBA用のコードを探したのだが、JavaScript用やC言語用しか見つからなかったので移植してみた。
検索用 VB VBA コムソート コームソート 櫛ソート comb sort
Private Function CombSort(ByVal ArrayData As Variant) As Variant Dim LowerBoundNumber As Long Dim UpperBoundNumber As Long Dim i As Long Dim j As Long Dim Temp As Variant Dim gap As Long Dim EndFlag As Boolean Dim CombGap As Single CombGap = 1.3 'constできるならしたほうがいいかも LowerBoundNumber = LBound(ArrayData) UpperBoundNumber = UBound(ArrayData) gap = UpperBoundNumber - LowerBoundNumber EndFlag = False Do While gap > 1 Or EndFlag = False gap = Int(gap / CombGap) If gap = 9 Or gap = 10 Then gap = 11 '↑この行はデータが少ない場合コメントアウトしてもいい If gap < 1 Then gap = 1 EndFlag = True For i = LowerBoundNumber To UpperBoundNumber - gap j = i + gap If ArrayData(i) > ArrayData(j) Then Temp = ArrayData(i) ArrayData(i) = ArrayData(j) ArrayData(j) = Temp EndFlag = False End If Next Loop CombSort = ArrayData End Function