|
楼主 |
发表于 2013-6-12 14:16
|
显示全部楼层
主要函数:
起始函数- Public Sub HeapSortFunction(arr() As Long)
-
- Dim i As Long
- Dim iLength As Long
-
- iLength = UBound(arr)
- Call BuildMaxHeap(arr, iLength) ' 创建大顶推(初始状态看做:整体无序)
- For i = iLength To 1 Step -1
-
- clsBin(0).setColor '用于观察交换的位置实际运行不需此语句
- clsBin(i).setColor '用于观察交换的位置实际运行不需此语句
-
- Call Swap(arr(0), arr(i), 0, i) ' 将堆顶元素依次与无序区的最后一位交换(使堆顶元素进入有序区)
- Call MaxHeapify(arr, 0, i) '重新将无序区调整为大顶堆
- Next i
-
-
- End Sub
复制代码 创建大顶推(根节点大于左右子节点)- ' 创建大顶推(根节点大于左右子节点)
- Private Sub BuildMaxHeap(arr() As Long, iLength As Long)
- Dim i As Long
-
- '根据大顶堆的性质可知:数组的前半段的元素为根节点,其余元素都为叶节点
- For i = iLength \ 2 To 0 Step -1 '从最底层的最后一个根节点开始进行大顶推的调整
-
- Call MaxHeapify(arr, i, iLength + 1) '调整大顶堆
- Next i
- End Sub
复制代码 核心函数:升序或降序在此函数调整- Private Sub MaxHeapify(arr() As Long, currentIndex As Long, heapSize As Long)
- Dim left As Long
- Dim right As Long
- Dim large As Long
-
- left = 2 * currentIndex + 1 '左子节点在数组中的位置
- right = 2 * currentIndex + 2 '右子节点在数组中的位置
- large = currentIndex '记录此根节点、左子节点、右子节点 三者中最大值的位置
- If left < heapSize Then
- If arr(left) > arr(large) Then '与左子节点进行比较
- large = left
- End If
- End If
- If right < heapSize Then
- If arr(right) > arr(large) Then '与右子节点进行比较
- large = right ';
- End If
- End If
- If currentIndex <> large Then '如果 currentIndex不等于large 则表明 large 发生变化(即:左右子节点中有大于根节点的情况)
-
- clsBin(currentIndex).setColor '用于观察交换的位置实际运行不需此语句
- clsBin(large).setColor '用于观察交换的位置实际运行不需此语句
-
- Call Swap(arr(currentIndex), arr(large), currentIndex, large) '将左右节点中的大者与根节点进行交换(即:实现局部大顶堆)
- Call MaxHeapify(arr, large, heapSize) '以上次调整动作的large位置(为此次调整的根节点位置),进行递归调整
- End If
-
- End Sub
复制代码 |
|