|
楼主 |
发表于 2014-8-28 10:57
|
显示全部楼层
If 判断优化的实例:
在QuickSort快速排序递归计算过程中,有一个重要的If判断。
未优化之前,网上流行的标准QuickSort代码是这样子的:
Sub QuickSort1(tr, l&, u&)
Dim i&, j&, x, t
i = l: j = u
x = tr((l + u) \ 2)
While i <= j
While i < u And tr(i) < x
i = i + 1
Wend
While j > l And tr(j) > x
j = j - 1
Wend
If i <= j Then
t = tr(i): tr(i) = tr(j): tr(j) = t
i = i + 1: j = j - 1
End If
' If i <= j Then t = tr(i): tr(i) = tr(j): tr(j) = t: i = i + 1: j = j - 1
Wend
If i < u Then Call QuickSort1(tr, i, u)
If j > l Then Call QuickSort1(tr, l, j)
End Sub
代码很简洁。
甚至可以简写为:
Sub QuickSort(tr, l&, u&)
Dim i&, j&, x, t
i = l: j = u: x = tr((l + u) \ 2)
While i <= j
While i < u And tr(i) < x: i = i + 1: Wend
While j > l And tr(j) > x: j = j - 1: Wend
If i <= j Then t = tr(i): tr(i) = tr(j): tr(j) = t: i = i + 1: j = j - 1
Wend
If i < u Then Call QuickSort(tr, i, u)
If j > l Then Call QuickSort(tr, l, j)
End Sub
但是,注意红色部分 While 条件循环时,使用了And 双条件。
我前面已经介绍过,使用And 和 Or 可以简化条件判断表达式,
在仅少数几次使用时毫无问题。
但在需要循环遍历、或者反复递归计算时,
那么把 And / Or 条件 拆分后分开处理,对代码执行效率的影响、是不可忽视的。
因此,代码可以优化、而且必须优化,以提高速度效率。
仅对红色部分的优化结果为:
Sub QuickSort2(tr, l&, u&) 'Divide & Conquer
Dim i&, j&, x, t
i = l: j = u
x = tr((l + u) \ 2)
While i <= j
Do While i < u
If tr(i) < x Then i = i + 1 Else Exit Do
Loop
Do While j > l
If tr(j) > x Then j = j - 1 Else Exit Do
Loop
If i <= j Then t = tr(i): tr(i) = tr(j): tr(j) = t: i = i + 1: j = j - 1
Wend
If i < u Then Call QuickSort2(tr, i, u)
If j > l Then Call QuickSort2(tr, l, j)
End Sub
把原来红色部分的While条件循环,改为Do……Loop循环,即可把两个条件拆分处理。
注意原则:把容易得到结果的退出条件(这里是 i < u 或 j > l)放在Do循环层面(外层),而里层放入If 条件判断
而粉红色部分的If结构,待会儿再优化。
…………
仅这么一改,代码执行效率提高 10-15%,这绝对不是一个可以忽略的改变。
|
|