算法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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值