小能豆

VBA数组排序功能?

vba

我正在寻找 VBA 中数组的合适排序实现。快速排序是首选。或者除冒泡或合并之外的任何其他排序算法都可以。

请注意,这是为了与 MS Project 2003 一起使用,因此应避免任何 Excel 本机函数和任何 .net 相关的内容。


阅读 210

收藏
2024-05-22

共1个答案

小能豆

在 VBA 中实现像 QuickSort 这样的排序算法可以高效地完成。下面是 VBA 中用于排序数组的 QuickSort 实现:

VBA 中的快速排序实现

此实现将与 VBA 中的数组一起使用,并且不依赖于 Excel 特定的函数,因此适合在 MS Project 2003 中使用。

维巴复制代码Sub QuickSort(arr As Variant, ByVal low As Long, ByVal high As Long)
    Dim pivotIndex As Long

    If low < high Then
        pivotIndex = Partition(arr, low, high)
        QuickSort arr, low, pivotIndex - 1
        QuickSort arr, pivotIndex + 1, high
    End If
End Sub

Function Partition(arr As Variant, ByVal low As Long, ByVal high As Long) As Long
    Dim pivot As Variant
    Dim i As Long
    Dim j As Long
    Dim temp As Variant

    pivot = arr(high)
    i = low - 1

    For j = low To high - 1
        If arr(j) <= pivot Then
            i = i + 1
            ' Swap arr(i) and arr(j)
            temp = arr(i)
            arr(i) = arr(j)
            arr(j) = temp
        End If
    Next j

    ' Swap arr(i + 1) and arr(high)
    temp = arr(i + 1)
    arr(i + 1) = arr(high)
    arr(high) = temp

    Partition = i + 1
End Function

Sub TestQuickSort()
    Dim myArray As Variant
    Dim i As Long

    ' Initialize the array
    myArray = Array(34, 7, 23, 32, 5, 62)

    ' Call QuickSort
    QuickSort myArray, LBound(myArray), UBound(myArray)

    ' Output the sorted array
    For i = LBound(myArray) To UBound(myArray)
        Debug.Print myArray(i)
    Next i
End Sub

守则解释

  1. 快速排序子程序
  2. QuickSort接受一个数组arr、一个起始索引low和一个结束索引high
  3. 如果low小于high,则对数组进行分区并对两个分区进行递归排序。
  4. 分区函数
  5. Partition选择最后一个元素作为主元,并对数组重新排序,使所有小于或等于主元的元素位于左侧,所有大于主元的元素位于右侧。
  6. 然后它返回分区后主元元素的索引。
  7. 测试快速排序子例程
  8. TestQuickSort初始化数组并调用QuickSort子程序。
  9. 然后它将排序后的数组打印到立即窗口。

如何使用

  1. 插入代码:将上述代码复制到 VBA 编辑器中的新模块中。
  2. 运行测试:执行TestQuickSort子例程以查看排序的实际情况。

此 QuickSort 实现应该可以有效地满足您在 MS Project 2003 中的排序需求,而无需依赖任何外部库或 Excel 特定的函数。

2024-05-22