代码审查
- 算法复杂度:
- 排序部分:使用的是冒泡排序算法,时间复杂度为 (O(n^2)),其中 (n) 是数据的数量。对于大量数据,这是非常低效的。
- 筛选部分:时间复杂度为 (O(n)),因为它遍历一次数据数组。
- 内存使用:
- 排序部分:在内存使用上,除了原数组
dataArray
,仅使用了几个临时变量 i
、j
和 temp
,额外空间复杂度为 (O(1))。
- 筛选部分:每次满足筛选条件时,使用
ReDim Preserve
调整 filteredArray
的大小。ReDim Preserve
每次操作的时间复杂度较高,因为它需要复制原数组内容到新的调整大小后的数组。同时,由于每次调整大小增加一个元素,这可能导致频繁的内存分配和复制,内存使用效率较低。
- 潜在性能瓶颈:
- 排序算法选择:冒泡排序在处理大量数据时性能较差,因为每次比较和交换操作的次数较多。
- 筛选部分的内存操作:频繁使用
ReDim Preserve
调整数组大小会带来较大的性能开销。
优化建议
- 排序算法优化:将冒泡排序替换为更高效的排序算法,例如快速排序(平均时间复杂度 (O(n log n)))。
- 筛选部分优化:预先计算筛选后数组的大小,然后一次性分配内存,避免频繁使用
ReDim Preserve
。
优化前后对整体性能的影响
- 排序部分:从 (O(n^2)) 的时间复杂度提升到平均 (O(n log n)) 的时间复杂度,对于大量数据,性能会有显著提升。
- 筛选部分:避免频繁的内存分配和复制操作,时间复杂度虽然仍然是 (O(n)),但实际运行效率会提高,减少了内存碎片的产生,提升了内存使用效率。
优化后的代码
Option Explicit
' 快速排序实现
Private Sub QuickSort(arr() As Integer, ByVal left As Integer, ByVal right As Integer)
Dim i As Integer, j As Integer, pivot As Integer, temp As Integer
i = left
j = right
pivot = arr((left + right) \ 2)
Do While i <= j
Do While arr(i) < pivot
i = i + 1
Loop
Do While arr(j) > pivot
j = j - 1
Loop
If i <= j Then
temp = arr(i)
arr(i) = arr(j)
arr(j) = temp
i = i + 1
j = j - 1
End If
Loop
If left < j Then
QuickSort arr, left, j
End If
If i < right Then
QuickSort arr, i, right
End If
End Sub
Public Sub Main()
Dim dataArray() As Integer
Dim i As Integer, j As Integer, temp As Integer
'初始化 dataArray 并填充大量数据(假设已经完成)
'排序部分
QuickSort dataArray, LBound(dataArray), UBound(dataArray)
'筛选部分
Dim filteredCount As Integer
filteredCount = 0
For i = LBound(dataArray) To UBound(dataArray)
If dataArray(i) Mod 2 = 0 Then
filteredCount = filteredCount + 1
End If
Next i
Dim filteredArray() As Integer
ReDim filteredArray(filteredCount - 1)
Dim index As Integer
index = 0
For i = LBound(dataArray) To UBound(dataArray)
If dataArray(i) Mod 2 = 0 Then
filteredArray(index) = dataArray(i)
index = index + 1
End If
Next i
End Sub