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