IDqq的代码仓库

运用之妙,存乎一心

导航

[原创]常用内部排序算法--用VB6实现

Posted on 2006-04-04 16:26  IDqq  阅读(1031)  评论(0)    收藏  举报

1 冒泡排序
冒泡排序虽然性能不高,但好歹是一种稳定的排序。在要求排序结果稳定,或者性能问题不很突出(比如给只含少量元素的小数组排序)的时候,用起来还是比较方便。下面给出一个较为通用的实现。

 1' 升序冒泡
 2Private 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
16End Sub

2 快速排序
快排可以说是应用最为广泛的一种排序了。快排的平均排序性能最好,但不是稳定的排序。
 1' 升序快排
 2Private Sub QuickSort(ByRef ary As Variant)
 3    Call QSort(ary, 0UBound(ary))
 4End Sub
 5
 6' 子函数:对子数组递归排序
 7Private 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
15End Sub
16
17' 子函数:选定ary(lLow)为枢轴,把数组分成比枢轴大/小的两部分
18Private Function Part(ByRef ary As Variant, ByVal lLow As Long, ByVal lHigh As LongAs 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
36End Function

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