1 冒泡排序
冒泡排序虽然性能不高,但好歹是一种稳定的排序。在要求排序结果稳定,或者性能问题不很突出(比如给只含少量元素的小数组排序)的时候,用起来还是比较方便。下面给出一个较为通用的实现。
1
' 升序冒泡
2
Private Sub Sort(ByRef ary As Variant)
3
Dim i As Long
4
Dim j As Long
5
Dim vTmp As Variant
6
7
For i = 0 To UBound(ary) - 1
8
For j = i + 1 To UBound(ary)
9
If ary(i) > ary(j) Then
10
vTmp = ary(i)
11
ary(i) = ary(j)
12
ary(j) = vTmp
13
End If
14
Next
15
Next
16
End Sub

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

2 快速排序
快排可以说是应用最为广泛的一种排序了。快排的平均排序性能最好,但不是稳定的排序。
1
' 升序快排
2
Private Sub QuickSort(ByRef ary As Variant)
3
Call QSort(ary, 0, UBound(ary))
4
End Sub
5
6
' 子函数:对子数组递归排序
7
Private Sub QSort(ByRef ary As Variant, ByVal lLow As Long, ByVal lHigh As Long)
8
Dim lPivot As Long
9
10
If lLow < lHigh Then
11
lPivot = Part(ary, lLow, lHigh)
12
Call QSort(ary, lLow, lPivot - 1)
13
Call QSort(ary, lPivot + 1, lHigh)
14
End If
15
End Sub
16
17
' 子函数:选定ary(lLow)为枢轴,把数组分成比枢轴大/小的两部分
18
Private Function Part(ByRef ary As Variant, ByVal lLow As Long, ByVal lHigh As Long) As Long
19
Dim vPivot As Variant
20
21
vPivot = ary(lLow)
22
Do While lLow < lHigh
23
Do While lLow < lHigh And ary(lHigh) >= vPivot
24
lHigh = lHigh - 1
25
Loop
26
If lLow = lHigh Then Exit Do
27
ary(lLow) = ary(lHigh)
28
Do While lLow < lHigh And ary(lLow) <= vPivot
29
lLow = lLow + 1
30
Loop
31
If lLow = lHigh Then Exit Do
32
ary(lHigh) = ary(lLow)
33
Loop
34
ary(lLow) = vPivot
35
Part = lLow
36
End Function

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

3 用法示例
1
Dim ary As Variant
2
Dim byt As Byte()
3
ary = Array(1, 3, 2, 5, 12, 8, 7, 9)
4
Sort ary
5
byt = StrConv("AZCDI", vbFromUnicode)
6
Sort byt
7
ary = Array(8, 1, 3, 2, 5, 12, 7, 9)
8
QuickSort ary

2

3

4

5

6

7

8
