转自(http://www.cnblogs.com/IDqq/archive/2006/04/04/366688.html)
1 冒泡排序
冒泡排序虽然性能不高,但好歹是一种稳定的排序。在要求排序结果稳定,或者性能问题不很突出(比如给只含少量元素的小数组排序)的时候,用起来还是比较方便。下面给出一个较为通用的实现。
' 升序冒泡 Private Sub Sort(ByRef ary As Variant) Dim i As Long Dim j As Long Dim vTmp As Variant For i = 0 To UBound(ary) - 1 For j = i + 1 To UBound(ary) If ary(i) > ary(j) Then vTmp = ary(i) ary(i) = ary(j) ary(j) = vTmp End If Next Next End Sub
2 快速排序
快排可以说是应用最为广泛的一种排序了。快排的平均排序性能最好,但不是稳定的排序。
' 升序快排 Private Sub QuickSort(ByRef ary As Variant) Call QSort(ary, 0, UBound(ary)) End Sub ' 子函数:对子数组递归排序 Private Sub QSort(ByRef ary As Variant, ByVal lLow As Long, ByVal lHigh As Long) Dim lPivot As Long If lLow < lHigh Then lPivot = Part(ary, lLow, lHigh) Call QSort(ary, lLow, lPivot - 1) Call QSort(ary, lPivot + 1, lHigh) End If End Sub ' 子函数:选定ary(lLow)为枢轴,把数组分成比枢轴大/小的两部分 Private Function Part(ByRef ary As Variant, ByVal lLow As Long, ByVal lHigh As Long) As Long Dim vPivot As Variant vPivot = ary(lLow) Do While lLow < lHigh Do While lLow < lHigh And ary(lHigh) >= vPivot lHigh = lHigh - 1 Loop If lLow = lHigh Then Exit Do ary(lLow) = ary(lHigh) Do While lLow < lHigh And ary(lLow) <= vPivot lLow = lLow + 1 Loop If lLow = lHigh Then Exit Do ary(lHigh) = ary(lLow) Loop ary(lLow) = vPivot Part = lLow End Function
3 用法示例
Dim ary As Variant Dim byt As Byte() ary = Array(1, 3, 2, 5, 12, 8, 7, 9) Sort ary byt = StrConv("AZCDI", vbFromUnicode) Sort byt ary = Array(8, 1, 3, 2, 5, 12, 7, 9) QuickSort ary