Sub STRINGSORT(ByRef a() As String, Optional sort As String = "UP") '字符串排序
Dim min As Long, max As Long, num As Long, first As Long, last As Long, temp As Long, all As New Collection, steps As Long
min = LBound(a)
max = UBound(a)
all.Add a(min)
steps = 1
For num = min + 1 To max
first = 1
last = all.Count
If a(num) < all(1) Then all.Add a(num), BEFORE:=1: GoTo nextnum '加到第一项
If a(num) > all(last) Then all.Add a(num), AFTER:=last: GoTo nextnum '加到最后一项
Do While last > first + 1 '利用DO循环减少循环次数
temp = (last + first) \ 2
If a(num) > all(temp) Then
first = temp
Else
last = temp
steps = steps + 1
End If
Loop
all.Add a(num), BEFORE:=last '加到指定的索引
nextnum:
steps = steps + 1
Next
For num = min To max
If sort = "UP" Or sort = "up" Then a(num) = all(num - min + 1): steps = steps + 1 '升序
If sort = "DOWN" Or sort = "down" Then a(num) = all(max - num + 1): steps = steps + 1 '降序
Next
MsgBox "本数组共经过 " & steps & "步实现" & IIf(sort = "UP" Or sort = "up", "升序", "降序") & "排序!", 64, "INFORMATION"
Set all = Nothing
End Sub
Private Sub Command1_Click()
Const temp = "0123456789abcdefghijklmnopqrstuvwxyz"
Dim x(200) As String
For i = 0 To 200
Randomize
x(i) = Mid(temp, Int(Rnd * 35 + 1), 1) & Mid(temp, Int(Rnd * 35 + 1), 1) & Mid(temp, Int(Rnd * 35 + 1), 1)
Next
MsgBox Join(x, ","), 64, "before sort"
STRINGSORT x, "down"' 降序
MsgBox Join(x, ","), 64, "after sort"
End Sub
'字符串快速排序(从小到大)
'函数:StrSortAZ
'参数:sArr String数组,First 数组的左边界,Last 数组右边界.
'返回值:无
'例子:
Public Sub StrSortAZ(ByRef sArr, First As Long, Last As Long)
Dim vSplit As String, vT As String
Dim I As Long, j As Long, iRand As Long
If First < Last Then
If Last - First = 1 Then
If sArr(First) > sArr(Last) Then
vT = sArr(First): sArr(First) = sArr(Last): sArr(Last) = vT
End If
Else
iRand = Int(First + (Rnd * (Last - First + 1)))
vT = sArr(Last): sArr(Last) = sArr(iRand): sArr(iRand) = vT
vSplit = sArr(Last)
Do
I = First: j = Last
Do While (I < j) And (sArr(I) <= vSplit)
I = I + 1
Loop
Do While (j > I) And (sArr(j) >= vSplit)
j = j - 1
Loop
If I < j Then
vT = sArr(I): sArr(I) = sArr(j): sArr(j) = vT
End If
Loop While I < j
If (I - First) < (Last - I) Then
StrSortAZ sArr, First, I - 1
StrSortAZ sArr, I + 1, Last
Else
StrSortAZ sArr, I + 1, Last
StrSortAZ sArr, First, I - 1
End If
End If
End If
End Sub
Private Sub Command1_Click()
StrTemp = Array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9")
Dim I As Long
ReDim NEWARR(10)
'
'字符串快速排序(从小到大)
'函数:StrSortAZ
'参数:sArr String数组,First 数组的左边界,Last 数组右边界.
'返回值:无
'例子:
Public Sub StrSortAZ(ByRef sArr() As String, First As Long, Last As Long)
Dim vSplit As String, vT As String
Dim I As Long, j As Long, iRand As Long
If First < Last Then
If Last - First = 1 Then
If sArr(First) > sArr(Last) Then
vT = sArr(First): sArr(First) = sArr(Last): sArr(Last) = vT
End If
Else
iRand = Int(First + (Rnd * (Last - First + 1)))
vT = sArr(Last): sArr(Last) = sArr(iRand): sArr(iRand) = vT
vSplit = sArr(Last)
Do
I = First: j = Last
Do While (I < j) And (sArr(I) <= vSplit)
I = I + 1
Loop
Do While (j > I) And (sArr(j) >= vSplit)
j = j - 1
Loop
If I < j Then
vT = sArr(I): sArr(I) = sArr(j): sArr(j) = vT
End If
Loop While I < j
If (I - First) < (Last - I) Then
StrSortAZ sArr(), First, I - 1
StrSortAZ sArr(), I + 1, Last
Else
StrSortAZ sArr(), I + 1, Last
StrSortAZ sArr(), First, I - 1
End If
End If
End If
End Sub
'
'数值快速排序(从小到大)
'函数:NumSortAZ
'参数:Myarray Double数组,L 数组的左边界,R 数组右边界.
'返回值:无
'例子:
Public Sub NumSortAZ(ByRef Myarray, L As Long, R As Long)
Dim I As Long, j As Long, A As Long
Dim TmpX As Variant, TmpA As Variant
I = L: j = R: TmpX = Myarray((L + R) / 2)
While (I <= j)
While (Myarray(I) < TmpX And I < R)
I = I + 1
Wend
While (TmpX < Myarray(j) And j > L)
j = j - 1
Wend
If (I <= j) Then
TmpA = Myarray(I)
Myarray(I) = Myarray(j)
Myarray(j) = TmpA
I = I + 1: j = j - 1
End If
Wend
If (L < j) Then Call NumSortAZ(Myarray, L, j)
If (I < R) Then Call NumSortAZ(Myarray, I, R)
End Sub