开发者社区 问答 正文

VBA数组排序功能?

我正在寻找一种在VBA中对数组进行良好排序的实现。最好使用Quicksort。或者,除了冒泡或合并以外的任何其他排序算法都足够。

请注意,这是与MS Project 2003一起使用的,因此应避免使用任何Excel本机功能以及与.net相关的任何内容。 问题来源于stack overflow

展开
收起
保持可爱mmm 2020-02-08 19:15:39 517 分享 版权
1 条回答
写回答
取消 提交回答
  • 如果有人需要,我将“快速快速排序”算法转换为VBA。

    我已经对其进行了优化以在一个Int / Longs数组上运行,但是将其转换为对任意可比较元素均有效的数组应该很简单。

    Private Sub QuickSort(ByRef a() As Long, ByVal l As Long, ByVal r As Long) Dim M As Long, i As Long, j As Long, v As Long M = 4

    If ((r - l) > M) Then
        i = (r + l) / 2
        If (a(l) > a(i)) Then swap a, l, i '// Tri-Median Methode!'
        If (a(l) > a(r)) Then swap a, l, r
        If (a(i) > a(r)) Then swap a, i, r
    
        j = r - 1
        swap a, i, j
        i = l
        v = a(j)
        Do
            Do: i = i + 1: Loop While (a(i) < v)
            Do: j = j - 1: Loop While (a(j) > v)
            If (j < i) Then Exit Do
            swap a, i, j
        Loop
        swap a, i, r - 1
        QuickSort a, l, j
        QuickSort a, i + 1, r
    End If
    

    End Sub

    Private Sub swap(ByRef a() As Long, ByVal i As Long, ByVal j As Long) Dim T As Long T = a(i) a(i) = a(j) a(j) = T End Sub

    Private Sub InsertionSort(ByRef a(), ByVal lo0 As Long, ByVal hi0 As Long) Dim i As Long, j As Long, v As Long

    For i = lo0 + 1 To hi0
        v = a(i)
        j = i
        Do While j > lo0
            If Not a(j - 1) > v Then Exit Do
            a(j) = a(j - 1)
            j = j - 1
        Loop
        a(j) = v
    Next i
    

    End Sub

    Public Sub sort(ByRef a() As Long) QuickSort a, LBound(a), UBound(a) InsertionSort a, LBound(a), UBound(a) End Sub

    2020-02-08 19:15:59
    赞同 展开评论
问答分类:
问答地址: