新年快乐! 各位亲! 说的好像有点晚了,应该昨天晚上说来着,结果我很不幸的睡着了^_^,一早起来看到上海踩死那么多人,还大部分是妹子,瞬间赶脚好可惜,感谢大家一路的陪伴,"一路上有你,苦一点也愿意",额,不扯了,祝各位也祝我自己来年健康顺利!
那啥,编程里面很多的排序算法,其中用的比较多的是冒泡算法,快速排序算法。
其中冒泡算法呢,顾名思义是和气泡有关系的,其实是实现过程有点像开水沸腾了冒气泡,当气泡大到一定程度,就由于某些复杂的物理原因(物理我就不分析了,我初中物理老师是美女,我只顾着看她了, 没认真听课)会跑到水面上!冒泡排序是通过两层循环把较大的数组元素放到最外层,这样通过多次循环就达到了排序的目的。
快速排序算法,其实是冒泡排序的一种改进,升级版吧。原理就是先在数组里面找一个参考值,然后用所有数组元素和这个参考值比较大小,比参考值大的数组元素放在一边,比参考值小的数组元素放在另一边,然后再递归的调用拆分出来的这两个数组部分(每个当成一个新数组),再找参考值,再拆分,直到拆分成每个数组都只有一个元素,在合并这些元素,就达到排序的效果了。
这两种算法各有特点,冒泡排序逻辑比较清晰,代码实现也比较简单,数据量小使用这个方法比较方便,如果数据量大,用于算法需要多次循环,就不是很方便了,排序算法实现起来比较麻烦,代码里面还用到了递归(简单的理解就是函数体自己调用自己),比较不容易理解,但是呢这个算法有优越性,数据量大的时候,较冒泡要快。
VBA不像其他语言有数组排序函数,所以挺麻烦的,当然你可以使用EXCEL内置的那个SORT排序还挺快的。
Option Explicit
Sub Sort() '用于测试
Dim frr As Variant
Dim i As Integer
frr = Array(34, 2, 1, 3, 4, 5, 6, 8, 7)
QuickSort frr, LBound(frr), UBound(frr)
'BubbleSort frr
For i = LBound(frr) To UBound(frr)
Debug.Print frr(i)
Next i
End Sub
Private Sub BubbleSort(ByRef Arr As Variant) '冒泡排序
Dim i As Integer, j As Integer
Dim tmp As Variant
For i = LBound(Arr) To UBound(Arr) - 1
For j = i + 1 To UBound(Arr)
If Arr(i) > Arr(j) Then
tmp = Arr(i)
Arr(i) = Arr(j)
Arr(j) = tmp
End If
Next j
Next i
End Sub
Private Sub QuickSort(ByRef Arr As Variant, L0 As Integer, B0 As Integer) '快速排序
Dim L As Integer
Dim B As Integer
Dim key As Integer
L = L0: B = B0
key = Arr(L0)
If (L0 >= B0) Then Exit Sub
While (L <> B)
While (L < B And Arr(B) >= key)
B = B - 1
Wend
Arr(L) = Arr(B)
While (L < B And Arr(L) <= key)
L = L + 1
Wend
Arr(B) = Arr(L)
Wend
Arr(L) = key
If L <= B And L0 <= L - 1 Then QuickSort Arr, L0, L - 1
If L <= B And L + 1 <= B0 Then QuickSort Arr, L + 1, B0
End Sub
上面这俩过程阔以放你的代码模块里面排序一维数组!哦了,吃饭去了!
http://pan.baidu.com/s/1nt7gERv