Me.Show Print "排序前" For i = 0 To 5 List1.AddItem a(i) Print a(i) Next
For i = 0 To 5 a(i) = List1.List(i) Next
Print Print "排序后" For i = 0 To 5 Print a(i) Next 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
' '字符串快速排序(从小到大) '函数: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 vT = sArr(I): sArr(I) = sArr(Last): sArr(Last) = vT 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
简单方法: 把数组元素添加到一个 Sorted = True 的 ListBox 中。
如下程序为何得不到预想的结果'字符串快速排序(从小到大) '函数: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 vT = sArr(I): sArr(I) = sArr(Last): sArr(Last) = vT 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) For I = 0 To 9 Randomize NEWARR(I) = StrTemp(Int((35 * Rnd) + 0)) & StrTemp(Int((35 * Rnd) + 0)) & StrTemp(Int((35 * Rnd) + 0)) & StrTemp(Int((35 * Rnd) + 0)) & StrTemp(Int((35 * Rnd) + 0)) & _ "." & StrTemp(Int((35 * Rnd) + 0)) & StrTemp(Int((35 * Rnd) + 0)) & StrTemp(Int((35 * Rnd) + 0)) Debug.Print "Bef-" & NEWARR(I) Next I
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 maxfirst = 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 SubPrivate Sub Command1_Click() Const temp = "0123456789abcdefghijklmnopqrstuvwxyz" Dim x(200) As StringFor 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
在学语言的时候接触过冒泡,选择,快速排序之类的编程,学数据结构的时候系统的对每种排序算法的速度做了全面的描述,还不知道!?
在窗体上放一个listbox,设置其sorted为true。Option ExplicitPrivate Sub Form_Load() Dim a(5) As String
Dim i As Integer List1.Clear
List1.Visible = False
a(0) = "9": a(1) = "a": a(2) = "5": a(3) = "4": a(4) = "s": a(5) = "1"
Me.Show
Print "排序前"
For i = 0 To 5
List1.AddItem a(i)
Print a(i)
Next
For i = 0 To 5
a(i) = List1.List(i)
Next
Print
Print "排序后"
For i = 0 To 5
Print a(i)
Next
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
'字符串快速排序(从小到大)
'函数: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 vT = sArr(I): sArr(I) = sArr(Last): sArr(Last) = vT 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
把数组元素添加到一个 Sorted = True 的 ListBox 中。
'函数: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 vT = sArr(I): sArr(I) = sArr(Last): sArr(Last) = vT 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) For I = 0 To 9
Randomize
NEWARR(I) = StrTemp(Int((35 * Rnd) + 0)) & StrTemp(Int((35 * Rnd) + 0)) & StrTemp(Int((35 * Rnd) + 0)) & StrTemp(Int((35 * Rnd) + 0)) & StrTemp(Int((35 * Rnd) + 0)) & _
"." & StrTemp(Int((35 * Rnd) + 0)) & StrTemp(Int((35 * Rnd) + 0)) & StrTemp(Int((35 * Rnd) + 0))
Debug.Print "Bef-" & NEWARR(I)
Next I
Call StrSortAZ(NEWARR, LBound(NEWARR), UBound(NEWARR))
For I = 0 To 9
Debug.Print "Aft-" & NEWARR(I)
Next I
End Sub-------------------输出
Bef-zuact.fsn
Bef-cdrfh.25r
Bef-xaftq.hzl
Bef-i627z.vug
Bef-33pm8.boa
Bef-zfjc1.fyu
Bef-lc6qb.ttp
Bef-57u4k.7nj
Bef-r4hjt.nhd
Bef-d14x1.1c7
Aft- '''这一行数据为空
Aft-33pm8.boa
Aft-57u4k.7nj
Aft-cdrfh.25r
Aft-d14x1.1c7
Aft-i627z.vug
Aft-lc6qb.ttp
Aft-r4hjt.nhd
Aft-xaftq.hzl
Aft-zfjc1.fyu
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 maxfirst = 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 SubPrivate Sub Command1_Click()
Const temp = "0123456789abcdefghijklmnopqrstuvwxyz"
Dim x(200) As StringFor 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