天天看点

算法4 vba实现归并排序

' 初步实现,
' 优化步骤
' 小数组使用插入排序
' 去除边界判断
' 不必要的合并
' 取消向辅助数组复制数据



Sub main()
    Dim a() As Variant
    
    
    Dim i As Integer
    
    i = Int(3 / 2)
    
    a = Array(1, 2, 5, 3, 7, 4)
    
    sort a
    
    Debug.Print 1
End Sub



Sub sort(a() As Variant)

    Dim aux()
    
    ReDim aux(UBound(a))
    
    doSort a, aux, 0, UBound(a)
    
End Sub


Sub doSort(a() As Variant, aux() As Variant, ByVal low As Integer, ByVal high As Integer)

    If high <= low Then Exit Sub
    
    Dim mid As Integer
    
    ' 如果是奇数个,左边多一个
    mid = Int((high + low) / 2)
    
    doSort a, aux, low, mid
    
    doSort a, aux, mid + 1, high
    
    merge a, aux, low, mid, high
    

End Sub

Sub merge(a() As Variant, aux() As Variant, ByVal low As Integer, ByVal mid As Integer, high As Integer)
    Dim i As Integer
    
    Dim j As Integer
    
    ' 作为辅助数组的最低索引,开始
    i = low
    
    ' 作为辅助防护组的最高索引,末尾
    j = high
    
    ' 把i-mid,升序放入aux
    
    Dim k As Integer
    
    For k = low To mid
        aux(k) = a(k)
    Next
    
    ' 把mid+1 到high ,降序放入aux
    For k = mid + 1 To high
        aux(k) = a(high - k + mid + 1)
    Next
    
    
    For k = low To high
        If aux(i) < aux(j) Then
            a(k) = aux(i)
            i = i + 1
        Else
            a(k) = aux(j)
            j = j - 1
        End If
        
    Next
    
    
End Sub


Function less(a, i As Integer, j As Integer) As Boolean
    less = a(i) < a(j)
End Function

Sub exch(a, i As Integer, j As Integer)
    Dim temp
    
    temp = a(i)
    
    a(i) = a(j)
    
    a(j) = temp
End Sub

           

继续阅读