希尔排序算法中不同步长序列的速度测试
下述代码测试了不同步长序列的执行速度,参考会跑法师的 有史以来最快的希尔排序
代码: | Sub TestShellSpeed()
Dim i&, t#, aData!(), arr, j&, sMsg$, aGaps
ReDim aData(1 To 1500)
Randomize
For i = 1 To UBound(aData)
aData(i) = Rnd
Next
Debug.Print
For i = 0 To 5
Select Case i
Case 0
aGaps = Array(929, 503, 211, 109, 41, 19, 5, 1)
sMsg = "法师改良的 Sedgewick 奇偶 序列"
Case 1
aGaps = Array(929, 505, 209, 109, 41, 19, 5, 1)
sMsg = "原本的 Sedgewick 奇偶 序列"
Case 2
aGaps = Array(1073, 281, 77, 23, 8, 1)
sMsg = "Sedgewick 的 序列"
Case 3
aGaps = Array(1182, 525, 233, 103, 46, 20, 9, 4, 1)
sMsg = "Tokuda 的 序列"
Case 4
aGaps = Array(701, 301, 132, 57, 23, 10, 4, 1)
sMsg = "Ciura 的 序列"
Case 5
aGaps = Array(836, 182, 34, 9, 1)
sMsg = "基于费波那契数列的 序列"
End Select
t = Timer
For j = 1 To 10 ^ 2 * 2
arr = aData
Call ShellSort(arr, aGaps)
Next
Debug.Print sMsg & ":" & Join(aGaps, ", ")
Debug.Print Format(Timer - t, "0.000 秒")
Next
End Sub
Sub ShellSort(ByRef arr, ByRef aGaps)
Dim i&, j&, vTemp, nGap, nLen&
nLen = UBound(arr)
For Each nGap In aGaps
For i = nGap + 1 To nLen
vTemp = arr(i)
For j = i To nGap + 1 Step nGap * -1
If arr(j - nGap) < vTemp Then Exit For
arr(j) = arr(j - nGap)
Next
arr(j) = vTemp
Next
Next
End Sub
|
我测试了5次所获结果如下:- 法师改良的 Sedgewick 奇偶 序列:929, 503, 211, 109, 41, 19, 5, 1
- 1.328 秒
- 原本的 Sedgewick 奇偶 序列:929, 505, 209, 109, 41, 19, 5, 1
- 1.324 秒
- Sedgewick 的 序列:1073, 281, 77, 23, 8, 1
- 1.438 秒
- Tokuda 的 序列:1182, 525, 233, 103, 46, 20, 9, 4, 1
- 1.313 秒
- Ciura 的 序列:701, 301, 132, 57, 23, 10, 4, 1
- 1.297 秒
- 基于费波那契数列的 序列:836, 182, 34, 9, 1
- 1.621 秒
- 法师改良的 Sedgewick 奇偶 序列:929, 503, 211, 109, 41, 19, 5, 1
- 1.355 秒
- 原本的 Sedgewick 奇偶 序列:929, 505, 209, 109, 41, 19, 5, 1
- 1.391 秒
- Sedgewick 的 序列:1073, 281, 77, 23, 8, 1
- 1.406 秒
- Tokuda 的 序列:1182, 525, 233, 103, 46, 20, 9, 4, 1
- 1.297 秒
- Ciura 的 序列:701, 301, 132, 57, 23, 10, 4, 1
- 1.281 秒
- 基于费波那契数列的 序列:836, 182, 34, 9, 1
- 1.480 秒
- 法师改良的 Sedgewick 奇偶 序列:929, 503, 211, 109, 41, 19, 5, 1
- 1.313 秒
- 原本的 Sedgewick 奇偶 序列:929, 505, 209, 109, 41, 19, 5, 1
- 1.309 秒
- Sedgewick 的 序列:1073, 281, 77, 23, 8, 1
- 1.391 秒
- Tokuda 的 序列:1182, 525, 233, 103, 46, 20, 9, 4, 1
- 1.281 秒
- Ciura 的 序列:701, 301, 132, 57, 23, 10, 4, 1
- 1.297 秒
- 基于费波那契数列的 序列:836, 182, 34, 9, 1
- 1.500 秒
- 法师改良的 Sedgewick 奇偶 序列:929, 503, 211, 109, 41, 19, 5, 1
- 1.313 秒
- 原本的 Sedgewick 奇偶 序列:929, 505, 209, 109, 41, 19, 5, 1
- 1.309 秒
- Sedgewick 的 序列:1073, 281, 77, 23, 8, 1
- 1.422 秒
- Tokuda 的 序列:1182, 525, 233, 103, 46, 20, 9, 4, 1
- 1.281 秒
- Ciura 的 序列:701, 301, 132, 57, 23, 10, 4, 1
- 1.266 秒
- 基于费波那契数列的 序列:836, 182, 34, 9, 1
- 1.543 秒
- 法师改良的 Sedgewick 奇偶 序列:929, 503, 211, 109, 41, 19, 5, 1
- 1.340 秒
- 原本的 Sedgewick 奇偶 序列:929, 505, 209, 109, 41, 19, 5, 1
- 1.313 秒
- Sedgewick 的 序列:1073, 281, 77, 23, 8, 1
- 1.406 秒
- Tokuda 的 序列:1182, 525, 233, 103, 46, 20, 9, 4, 1
- 1.297 秒
- Ciura 的 序列:701, 301, 132, 57, 23, 10, 4, 1
- 1.277 秒
- 基于费波那契数列的 序列:836, 182, 34, 9, 1
- 1.531 秒
复制代码 显然,我个人认为法师所谓的改良是很没有道理的~~
|