VBScript でクイックソートを使ってたらスタックが不足したので、 コムソートを使ってみた。 ついでに処理時間を計測して比較して見る。
VBScript版クイックソート
Sub QuickSort(SortArr)
Dim pivot, i, j
pivot = SortArr(Int((l + r) / 2)) 'SortArr(l)
i = LBound(SortArr): j = UBound(SortArr)
Do
While SortArr(i) > pivot: i = i + 1: Wend ' 昇順:<、降順:>
While SortArr(j) < pivot: j = j - 1: Wend ' 昇順:>、降順:<
If i >= j Then Exit Do
Swap SortArr, i, j
i = i + 1: j = j - 1
Loop
If l < i - 1 Then QuickSort SortArr, l, i - 1
If j + 1 < r Then QuickSort SortArr, j + 1, r
End Sub
VBScript版コムソート
Sub CombSort(SortArr)
Dim h, swapped, i, j, temp
h = UBound(SortArr)
swapped = False
Do While h > 1 Or swapped
h = Int(h/1.3)
If h = 9 Or h = 10 Then h = 11 ' CombSort11
If h < 1 Then h = 1
swapped = False
For i = 0 To UBound(SortArr) - h
If SortArr(i) > SortArr(i + h) Then ' 昇順:>、 降順:<
temp = SortArr(i)
SortArr(i) = SortArr(i + h)
SortArr(i + h) = temp
swapped = True
End If
Next
Loop
End Sub
計測は乱数データ数6種類の10回平均で比較。 計60個の乱数をクイックソート・コムソートでソートしてます。
クイックソートとコムソートの処理時間の比較
クイックソートが圧勝でした。 平均2倍コムソートのほうが時間がかかります。 非再帰クイックソートを組んだほうが良かったような(´・ω・`) ただ処理時間のばらつきがコムソートのほうがないです。