给你一个我编制的排序模块罢Sub BubbleSort(List() As Long, Number As Long, DataCount As Long, SmallToBig As Boolean) '/蒋玉龙于2003-03-08晚0:36编制,数组排序功能/'传递过来的数组,共2维,N组数据//根据第Number个数据信息排序//总共DataCount个数据信息 '例如:X(N,4)→共N组数据,每组4个数据信息,分为/N,0/N,1/N,2/N,4/ Dim First As Long, Last As Long Dim ii As Long, JJ As Long, KK As Long '定义一个可以保存一维多数据的临时变量 Dim Temp() As Long ReDim Temp(DataCount) '*********************************************************** '调用方法 'Dim List(0 To 3, 0 To 2) As Long 'Dim II As Long ' 'List(0, 0) = 15 'List(0, 1) = 23 →用做排序 'List(0, 2) = 62 ' 'List(1, 0) = 43 'List(1, 1) = 53 →用做排序 'List(1, 2) = 34 ' 'List(2, 0) = 46 'List(2, 1) = 231→用做排序 'List(2, 2) = 34 ' 'List(3, 0) = 12 'List(3, 1) = 13 →用做排序 'List(3, 2) = 22 ' 'BubbleSort List(), 2, 3, False '按照第2个信息排序,总共每维3组数据,从大到小 '*************************************************************** First = LBound(List, 1) '取得数组第1维上界 Last = UBound(List, 1) '取得数组第1维下界——判断出来有多少数据 'II是负责循环数据个数[维数],JJ是内层循环 For ii = First To Last - 1 '冒泡排序法 For JJ = ii + 1 To Last If SmallToBig = True Then '从小到大 If List(ii, Number - 1) > List(JJ, Number - 1) Then '记录第JJ个数据 For KK = 0 To DataCount - 1 Temp(KK) = List(JJ, KK) Next For KK = 0 To DataCount - 1 List(JJ, KK) = List(ii, KK) Next '恢复数据 For KK = 0 To DataCount - 1 List(ii, KK) = Temp(KK) Next End If Else '从大到小 If List(ii, Number - 1) < List(JJ, Number - 1) Then '记录第JJ个数据 For KK = 0 To DataCount - 1 Temp(KK) = List(JJ, KK) Next For KK = 0 To DataCount - 1 List(JJ, KK) = List(ii, KK) Next '恢复数据 For KK = 0 To DataCount - 1 List(ii, KK) = Temp(KK) Next End If End If Next Next End Sub
Option Explicit Dim i As Long, j As Long, t As LongDim a(10) As TextBox Private Sub Form_Activate() Randomize For i = 0 To 10 Set a(i) = Text1(i) a(i).Text = Int(Rnd * 199) - 99 a(i).BackColor = RGB(255, 255, 255) Next i Command1.Enabled = True Frame1.Height = 1980 End Sub Private Sub Command1_Click() Command1.Enabled = False For i = 1 To 9 Label2.Caption = " 从A(1)到A(" & Trim(11 - i) & _ "),将相连两数进行比较,并将小者置前,A(" + Trim(11 - i) & _ "),将为A(1)至A(" & Trim(11 - i) & ")中的最大者。“" For j = 1 To 10 - i a(j).BackColor = RGB(225, 0, 225): a(j + 1).BackColor = RGB(225, 0, 225) If Val(a(j).Text) > Val(a(j + 1).Text) Then MsgBox "交换A(" & Trim(j) & ")和A(" & Trim(j + 1) & ")", , "A(" & Trim(j) & ")>A(" & Trim(j + 1) & ")" t = a(j).Text: a(j).Text = a(j + 1).Text: a(j + 1).Text = t End If a(j).BackColor = RGB(225, 0, 225) Next j a(j).BackColor = RGB(0, 225, 0) Next i a(1).BackColor = RGB(0, 225, 0) Label2.Caption = " " Frame1.Height = 1000 End Sub Private Sub Command2_Click() Form_Activate End Sub 上面的调试运行成功,结果也很正确
'/蒋玉龙于2003-03-08晚0:36编制,数组排序功能/'传递过来的数组,共2维,N组数据//根据第Number个数据信息排序//总共DataCount个数据信息
'例如:X(N,4)→共N组数据,每组4个数据信息,分为/N,0/N,1/N,2/N,4/
Dim First As Long, Last As Long
Dim ii As Long, JJ As Long, KK As Long
'定义一个可以保存一维多数据的临时变量
Dim Temp() As Long
ReDim Temp(DataCount)
'***********************************************************
'调用方法
'Dim List(0 To 3, 0 To 2) As Long
'Dim II As Long
'
'List(0, 0) = 15
'List(0, 1) = 23 →用做排序
'List(0, 2) = 62
'
'List(1, 0) = 43
'List(1, 1) = 53 →用做排序
'List(1, 2) = 34
'
'List(2, 0) = 46
'List(2, 1) = 231→用做排序
'List(2, 2) = 34
'
'List(3, 0) = 12
'List(3, 1) = 13 →用做排序
'List(3, 2) = 22
'
'BubbleSort List(), 2, 3, False
'按照第2个信息排序,总共每维3组数据,从大到小
'***************************************************************
First = LBound(List, 1) '取得数组第1维上界
Last = UBound(List, 1) '取得数组第1维下界——判断出来有多少数据
'II是负责循环数据个数[维数],JJ是内层循环
For ii = First To Last - 1 '冒泡排序法
For JJ = ii + 1 To Last
If SmallToBig = True Then '从小到大
If List(ii, Number - 1) > List(JJ, Number - 1) Then
'记录第JJ个数据
For KK = 0 To DataCount - 1
Temp(KK) = List(JJ, KK)
Next
For KK = 0 To DataCount - 1
List(JJ, KK) = List(ii, KK)
Next
'恢复数据
For KK = 0 To DataCount - 1
List(ii, KK) = Temp(KK)
Next
End If
Else '从大到小
If List(ii, Number - 1) < List(JJ, Number - 1) Then
'记录第JJ个数据
For KK = 0 To DataCount - 1
Temp(KK) = List(JJ, KK)
Next
For KK = 0 To DataCount - 1
List(JJ, KK) = List(ii, KK)
Next
'恢复数据
For KK = 0 To DataCount - 1
List(ii, KK) = Temp(KK)
Next
End If
End If
Next
Next
End Sub
Dim i As Long, j As Long, t As LongDim a(10) As TextBox
Private Sub Form_Activate()
Randomize
For i = 0 To 10
Set a(i) = Text1(i)
a(i).Text = Int(Rnd * 199) - 99
a(i).BackColor = RGB(255, 255, 255)
Next i
Command1.Enabled = True
Frame1.Height = 1980
End Sub
Private Sub Command1_Click()
Command1.Enabled = False
For i = 1 To 9
Label2.Caption = " 从A(1)到A(" & Trim(11 - i) & _
"),将相连两数进行比较,并将小者置前,A(" + Trim(11 - i) & _
"),将为A(1)至A(" & Trim(11 - i) & ")中的最大者。“"
For j = 1 To 10 - i
a(j).BackColor = RGB(225, 0, 225): a(j + 1).BackColor = RGB(225, 0, 225)
If Val(a(j).Text) > Val(a(j + 1).Text) Then
MsgBox "交换A(" & Trim(j) & ")和A(" & Trim(j + 1) & ")", , "A(" & Trim(j) & ")>A(" & Trim(j + 1) & ")"
t = a(j).Text: a(j).Text = a(j + 1).Text: a(j + 1).Text = t
End If
a(j).BackColor = RGB(225, 0, 225)
Next j
a(j).BackColor = RGB(0, 225, 0)
Next i
a(1).BackColor = RGB(0, 225, 0)
Label2.Caption = " "
Frame1.Height = 1000
End Sub
Private Sub Command2_Click()
Form_Activate
End Sub
上面的调试运行成功,结果也很正确
或者把他记到一个只有2列的2维数组中,第一列存放排序好的数据,第二列存放数据在原来数组中的位置。
这是最慢的排序方法之一,可以考虑用Shell Sort,他排序5000个元素只要100ms左右,而bubble sort需要至少5秒好像(我记得)