ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 有史以来最快的希尔排序 - 比历史贴快10倍,比Excel排序更快 - 兼论堆排序和快速排序

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2013-8-25 16:39 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖已被收录到知识树中,索引项:排序
果然厉害{:soso_e130:}{:soso_e130:}

TA的精华主题

TA的得分主题

发表于 2013-10-17 00:11 | 显示全部楼层
学习。。。。

TA的精华主题

TA的得分主题

发表于 2013-10-17 07:13 | 显示全部楼层
排序问题没注意过...  学习一下!!

TA的精华主题

TA的得分主题

发表于 2014-2-13 19:03 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-3-29 00:15 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-11-28 22:07 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-11-28 22:10 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
膜拜,数学不好伤不起

TA的精华主题

TA的得分主题

发表于 2015-1-12 19:19 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
一点都不懂,看得头晕眼花

TA的精华主题

TA的得分主题

发表于 2015-4-27 14:56 | 显示全部楼层
1.法师大侠,我拿您的代码出去交流,结果别人给我了一段很简单的快排代码。比您本帖提供的快了将近50%
  我感觉是不是您所做的那些优化没意义了
2.本代码要怎样添加第二个参数,Optional SortUpDown as boolean = true
  1. Private Sub QuickSort(ByRef key_arr() As Long, L As Long, R As Long)
  2.     Dim i As Long, j As Long
  3.     Dim x As Long, Swap As Long
  4.     If R - L <= 16 Then
  5.         For i = L To R
  6.             x = i
  7.             For j = i + 1 To R
  8.                 If key_arr(j) < key_arr(x) Then
  9.                     x = j
  10.                 End If
  11.             Next j
  12.             
  13.             If x > i Then
  14.                 Swap = key_arr(i)
  15.                 key_arr(i) = key_arr(j)
  16.                 key_arr(j) = Swap
  17.             End If
  18.         Next i
  19.     Else
  20.         x = key_arr((L + R) \ 2)
  21.         i = L
  22.         j = R
  23.         Do While i <= j
  24.             Do While key_arr(i) < x
  25.                 i = i + 1
  26.             Loop
  27.             
  28.             Do While key_arr(j) > x
  29.                 j = j - 1
  30.             Loop
  31.            
  32.             If i <= j Then
  33.                 Swap = key_arr(i)
  34.                 key_arr(i) = key_arr(j)
  35.                 key_arr(j) = Swap
  36.                 i = i + 1
  37.                 j = j - 1
  38.             End If
  39.         Loop

  40.         '递归方法
  41.         If (L < j) Then Call QuickSort(key_arr, L, j)
  42.         If (i < R) Then Call QuickSort(key_arr, i, R)
  43.     End If
  44. End Sub

  45. Public Sub StartSort(ByRef vArray() As Long)
  46.     Dim iLow As Long
  47.     Dim iHi As Long
  48.    
  49.     '//get range of array
  50.     iLow = LBound(vArray) '//Low bound
  51.     iHi = UBound(vArray)  '//High bound
  52.    
  53.     '//use STACK, not RECURSION
  54.     QuickSort vArray(), iLow, iHi   '//call the procedure
  55.    
  56. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2015-4-27 14:57 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 loquat 于 2015-4-27 14:59 编辑

请大侠出手释疑本人的电脑上,上楼代码VBA环境下,一下代码的测试时间小于1s
  1. Private Sub Command1_Click()
  2. Dim n() As Long
  3. m = 1048576
  4. ReDim n(1 To m)
  5. For i = 1 To m
  6.     n(i) = 10000 * Rnd
  7. Next
  8. t = Timer
  9. StartSort n
  10. debug.print Timer - t
  11. End Sub
复制代码


您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-15 07:38 , Processed in 0.030480 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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