|
在MergeSort的子过程中,为什么在递归排序左半部分right的值最后变成0了,在递归排序右半部分的时候right马上又变成了1
- Sub MergeSortExample()
- Dim arr() As Variant
- arr = Array(3, 6, 8, 10, 1, 2, 1)
-
- Debug.Print "原始数组:"
- PrintArray arr
- ' 调用归并排序
- MergeSort arr, LBound(arr), UBound(arr)
-
- Debug.Print "排序后的数组:"
- PrintArray arr
- End Sub
- Sub PrintArray(arr() As Variant)
- Dim i As Integer
- For i = LBound(arr) To UBound(arr)
- Debug.Print arr(i);
- Next i
- Debug.Print
- End Sub
- Sub MergeSort(arr() As Variant, left As Integer, right As Integer)
- If left < right Then
- Dim mid As Integer
- mid = (left + right) \ 2
-
- ' 递归排序左半部分
- MergeSort arr, left, mid
-
- ' 递归排序右半部分
- MergeSort arr, mid + 1, right
-
- ' 合并两个有序部分
- Merge arr, left, mid, right
- End If
- End Sub
- Sub Merge(arr() As Variant, left As Integer, mid As Integer, right As Integer)
- Dim temp() As Integer
- Dim i As Integer, j As Integer, k As Integer
- Dim n1 As Integer, n2 As Integer
-
- ' 计算两个子数组的大小
- n1 = mid - left + 1
- n2 = right - mid
-
- ' 创建临时数组
- ReDim temp(left To right)
-
- ' 将左半部分数据拷贝到临时数组
- For i = 0 To n1 - 1
- temp(left + i) = arr(left + i)
- Next i
-
- ' 将右半部分数据拷贝到临时数组
- For j = 0 To n2 - 1
- temp(mid + 1 + j) = arr(mid + 1 + j)
- Next j
-
- ' 初始化指针
- i = left ' 左半部分起始点
- j = mid + 1 ' 右半部分起始点
- k = left ' 合并后的数组起始点
-
- ' 合并两个有序子数组
- While i <= mid And j <= right
- If temp(i) <= temp(j) Then
- arr(k) = temp(i)
- i = i + 1
- Else
- arr(k) = temp(j)
- j = j + 1
- End If
- k = k + 1
- Wend
-
- ' 拷贝剩余的左半部分元素
- While i <= mid
- arr(k) = temp(i)
- i = i + 1
- k = k + 1
- Wend
-
- ' 拷贝剩余的右半部分元素
- While j <= right
- arr(k) = temp(j)
- j = j + 1
- k = k + 1
- Wend
-
- ' 打印每次合并后的数组
- Debug.Print "合并后:"
- PrintArray arr
- End Sub
复制代码
|
|