ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: lee1892

[原创] VBA编程技巧 之 排序算法初探

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2013-4-20 21:40 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖已被收录到知识树中,索引项:排序
太牛了,下载后慢慢消化。

TA的精华主题

TA的得分主题

发表于 2013-4-20 22:36 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
一般我就用选择排序……或者偷懒直接输出结果到工作表后排序。

TA的精华主题

TA的得分主题

发表于 2013-4-22 13:59 | 显示全部楼层
好东西啊,需要慢慢消化。不太会C 语言,研究算法特别是指针的地方费劲了哦。
谢谢lee1892 大师

TA的精华主题

TA的得分主题

发表于 2013-4-22 16:03 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
看的眼花缭乱啊,膜拜一下。
等进化了再来消化,楼主辛苦了。

TA的精华主题

TA的得分主题

发表于 2013-4-22 18:51 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-4-22 19:34 | 显示全部楼层
表示太高深了 膜拜一下 以后再看

TA的精华主题

TA的得分主题

发表于 2013-4-23 11:34 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-4-23 12:57 | 显示全部楼层
相当牛,只会工作表排序法。

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-24 12:28 | 显示全部楼层
希尔排序算法中不同步长序列的速度测试

下述代码测试了不同步长序列的执行速度,参考会跑法师的  有史以来最快的希尔排序
代码:
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次所获结果如下:
  1. 法师改良的 Sedgewick 奇偶 序列:929, 503, 211, 109, 41, 19, 5, 1
  2. 1.328 秒
  3. 原本的 Sedgewick 奇偶 序列:929, 505, 209, 109, 41, 19, 5, 1
  4. 1.324 秒
  5. Sedgewick 的 序列:1073, 281, 77, 23, 8, 1
  6. 1.438 秒
  7. Tokuda 的 序列:1182, 525, 233, 103, 46, 20, 9, 4, 1
  8. 1.313 秒
  9. Ciura 的 序列:701, 301, 132, 57, 23, 10, 4, 1
  10. 1.297 秒
  11. 基于费波那契数列的 序列:836, 182, 34, 9, 1
  12. 1.621 秒

  13. 法师改良的 Sedgewick 奇偶 序列:929, 503, 211, 109, 41, 19, 5, 1
  14. 1.355 秒
  15. 原本的 Sedgewick 奇偶 序列:929, 505, 209, 109, 41, 19, 5, 1
  16. 1.391 秒
  17. Sedgewick 的 序列:1073, 281, 77, 23, 8, 1
  18. 1.406 秒
  19. Tokuda 的 序列:1182, 525, 233, 103, 46, 20, 9, 4, 1
  20. 1.297 秒
  21. Ciura 的 序列:701, 301, 132, 57, 23, 10, 4, 1
  22. 1.281 秒
  23. 基于费波那契数列的 序列:836, 182, 34, 9, 1
  24. 1.480 秒

  25. 法师改良的 Sedgewick 奇偶 序列:929, 503, 211, 109, 41, 19, 5, 1
  26. 1.313 秒
  27. 原本的 Sedgewick 奇偶 序列:929, 505, 209, 109, 41, 19, 5, 1
  28. 1.309 秒
  29. Sedgewick 的 序列:1073, 281, 77, 23, 8, 1
  30. 1.391 秒
  31. Tokuda 的 序列:1182, 525, 233, 103, 46, 20, 9, 4, 1
  32. 1.281 秒
  33. Ciura 的 序列:701, 301, 132, 57, 23, 10, 4, 1
  34. 1.297 秒
  35. 基于费波那契数列的 序列:836, 182, 34, 9, 1
  36. 1.500 秒

  37. 法师改良的 Sedgewick 奇偶 序列:929, 503, 211, 109, 41, 19, 5, 1
  38. 1.313 秒
  39. 原本的 Sedgewick 奇偶 序列:929, 505, 209, 109, 41, 19, 5, 1
  40. 1.309 秒
  41. Sedgewick 的 序列:1073, 281, 77, 23, 8, 1
  42. 1.422 秒
  43. Tokuda 的 序列:1182, 525, 233, 103, 46, 20, 9, 4, 1
  44. 1.281 秒
  45. Ciura 的 序列:701, 301, 132, 57, 23, 10, 4, 1
  46. 1.266 秒
  47. 基于费波那契数列的 序列:836, 182, 34, 9, 1
  48. 1.543 秒

  49. 法师改良的 Sedgewick 奇偶 序列:929, 503, 211, 109, 41, 19, 5, 1
  50. 1.340 秒
  51. 原本的 Sedgewick 奇偶 序列:929, 505, 209, 109, 41, 19, 5, 1
  52. 1.313 秒
  53. Sedgewick 的 序列:1073, 281, 77, 23, 8, 1
  54. 1.406 秒
  55. Tokuda 的 序列:1182, 525, 233, 103, 46, 20, 9, 4, 1
  56. 1.297 秒
  57. Ciura 的 序列:701, 301, 132, 57, 23, 10, 4, 1
  58. 1.277 秒
  59. 基于费波那契数列的 序列:836, 182, 34, 9, 1
  60. 1.531 秒
复制代码
显然,我个人认为法师所谓的改良是很没有道理的~~

TA的精华主题

TA的得分主题

发表于 2013-4-24 12:33 | 显示全部楼层
本帖最后由 liucqa 于 2013-4-24 12:43 编辑
lee1892 发表于 2013-4-24 12:28
希尔排序算法中不同步长序列的速度测试

下述代码测试了不同步长序列的执行速度,参考会跑法师的  有史以 ...

搞100万数据测试看看


法师改良的 Sedgewick 奇偶 序列:929, 503, 211, 109, 41, 19, 5, 1
1.152 秒
原本的 Sedgewick 奇偶 序列:929, 505, 209, 109, 41, 19, 5, 1
1.152 秒
Sedgewick 的 序列:1073, 281, 77, 23, 8, 1
1.270 秒
Tokuda 的 序列:1182, 525, 233, 103, 46, 20, 9, 4, 1
1.164 秒
Ciura 的 序列:701, 301, 132, 57, 23, 10, 4, 1
1.180 秒
基于费波那契数列的 序列:836, 182, 34, 9, 1
1.363 秒
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-21 17:17 , Processed in 0.037568 second(s), 5 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表