ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2747|回复: 7

[分享] 堆排序演示

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-6-12 14:10 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:排序
堆排序是一种高效的排序方法,关于原理算法,论坛和网上有许多帖子介绍,这里就不复述了,直接发个实例给初学的同学参考。

堆排序演示.png

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-6-12 14:16 | 显示全部楼层
主要函数:

起始函数
  1. Public Sub HeapSortFunction(arr() As Long)
  2.         
  3.     Dim i As Long
  4.     Dim iLength As Long
  5.    
  6.     iLength = UBound(arr)
  7.     Call BuildMaxHeap(arr, iLength) ' 创建大顶推(初始状态看做:整体无序)
  8.     For i = iLength To 1 Step -1
  9.         
  10.         clsBin(0).setColor   '用于观察交换的位置实际运行不需此语句
  11.         clsBin(i).setColor   '用于观察交换的位置实际运行不需此语句
  12.         
  13.         Call Swap(arr(0), arr(i), 0, i) ' 将堆顶元素依次与无序区的最后一位交换(使堆顶元素进入有序区)
  14.         Call MaxHeapify(arr, 0, i) '重新将无序区调整为大顶堆
  15.     Next i
  16.             
  17.         
  18. End Sub
复制代码
创建大顶推(根节点大于左右子节点)
  1. ' 创建大顶推(根节点大于左右子节点)

  2. Private Sub BuildMaxHeap(arr() As Long, iLength As Long)

  3.     Dim i As Long
  4.    
  5.     '根据大顶堆的性质可知:数组的前半段的元素为根节点,其余元素都为叶节点
  6.     For i = iLength \ 2 To 0 Step -1        '从最底层的最后一个根节点开始进行大顶推的调整
  7.    
  8.         Call MaxHeapify(arr, i, iLength + 1) '调整大顶堆
  9.     Next i

  10. End Sub
复制代码
核心函数:升序或降序在此函数调整
  1. Private Sub MaxHeapify(arr() As Long, currentIndex As Long, heapSize As Long)

  2.     Dim left As Long
  3.     Dim right As Long
  4.     Dim large As Long
  5.    
  6.     left = 2 * currentIndex + 1         '左子节点在数组中的位置
  7.     right = 2 * currentIndex + 2        '右子节点在数组中的位置
  8.     large = currentIndex                '记录此根节点、左子节点、右子节点 三者中最大值的位置

  9.     If left < heapSize Then
  10.         If arr(left) > arr(large) Then  '与左子节点进行比较
  11.             large = left
  12.         End If
  13.     End If
  14.     If right < heapSize Then
  15.         If arr(right) > arr(large) Then '与右子节点进行比较
  16.             large = right ';
  17.         End If
  18.     End If
  19.     If currentIndex <> large Then '如果 currentIndex不等于large 则表明 large 发生变化(即:左右子节点中有大于根节点的情况)
  20.         
  21.         clsBin(currentIndex).setColor   '用于观察交换的位置实际运行不需此语句
  22.         clsBin(large).setColor          '用于观察交换的位置实际运行不需此语句
  23.         
  24.         Call Swap(arr(currentIndex), arr(large), currentIndex, large) '将左右节点中的大者与根节点进行交换(即:实现局部大顶堆)
  25.         Call MaxHeapify(arr, large, heapSize) '以上次调整动作的large位置(为此次调整的根节点位置),进行递归调整
  26.     End If
  27.    
  28. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-6-12 14:18 | 显示全部楼层
附件是实例,附件在0ffice2010测试通过。

堆排序演示.rar

27.57 KB, 下载次数: 105

TA的精华主题

TA的得分主题

发表于 2013-6-12 14:21 | 显示全部楼层
虽然不是很了解,但是觉得很牛X

TA的精华主题

TA的得分主题

发表于 2013-6-12 15:16 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-2-25 10:19 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-7-3 08:58 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-7-3 09:02 | 显示全部楼层
tjusophia 发表于 2014-7-3 08:58
密码是多少

我发的附件从来不加密码。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-26 11:30 , Processed in 0.047164 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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