VB 选择法对一组数字由小到大排序并显示每一步变换,每次交换的两个数字变颜色且闪烁,跪求求高手

如题所述

这里用6个 数字来演示,你创建一个form,然后 放上去一个label,复制 5个label 再,组成一个label数组,然后放一个button按钮,就可以演示了

Dim shuzhi(5) As Integer

Private Sub Command1_Click()

selectsort shuzhi

End Sub

Private Sub Form_Load()

'初始化

 For i = 0 To UBound(shuzhi)

 Randomize

 shuzhi(i) = Rnd() * 100

 

 Label1(i).Caption = shuzhi(i)

 Next

 

 

End Sub

Sub selectsort(shuzhi() As Integer)

Dim i, j, k As Integer

Dim min As Integer

For i = 0 To UBound(shuzhi) - 1

    k = i

    For j = i + 1 To UBound(shuzhi)

         DoEvents

       

         WaitTime 1

         '

         If shuzhi(j) < shuzhi(k) Then

         k = j

         End If

        

    Next

    

    

    '闪烁动画

    

    If k <> i Then

         min = shuzhi(i)

         shuzhi(i) = shuzhi(k)

         shuzhi(k) = min

         

         Label1(i).ForeColor = &HC0&

         Label1(i).Caption = shuzhi(i)

         Label1(k).ForeColor = &HC0&

         Label1(k).Caption = shuzhi(k)

         

         WaitTime 1

          

         Label1(i).ForeColor = &H0&

         Label1(i).Caption = shuzhi(i)

         Label1(k).ForeColor = &H0&

         Label1(k).Caption = shuzhi(k)

         

         WaitTime 1

          

          

         Label1(i).ForeColor = &HC0&

         Label1(i).Caption = shuzhi(i)

         Label1(k).ForeColor = &HC0&

         Label1(k).Caption = shuzhi(k)

         

         WaitTime 1

          

         Label1(i).ForeColor = &H0&

         Label1(i).Caption = shuzhi(i)

         Label1(k).ForeColor = &H0&

         Label1(k).Caption = shuzhi(k)

         WaitTime 1

    End If

Next

 For i = 0 To UBound(shuzhi)

  Label1(i).Caption = shuzhi(i)

 Next

End Sub

'延时函数

Private Sub WaitTime(t As Single)

    Dim starttime As Single

    starttime = Second(Now)

    Do Until (60 + Second(Now) - starttime) Mod 60 > t

    DoEvents

    Loop

End Sub

追问

图貌似对,不过随机出数之后就没了,也不对啊

追答

什么没了?你点sort 那个按钮了没,才开始排序,大概速度不快,因为演示动画的

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-14
新工程,一个 label1, 一个 label2, 一个 command1,
一个 timer : interval =100,enable=false
一个 Listbox : 想排序几个 就设置成显示多少行, MAX 变量里放的是多少行
我的代码里默认是10行,所以 加入 Listbox 控件,让 List控件正好显示10行。
如果你修改代码 比如改成20行,那么相对的List控件也要正好显示20行。
其他没什么 自己研究吧
-------------------------------------------------

Private MAX As Integer
Private TTT As Integer
Private flag As Boolean
Private a As Integer
Private b As Integer

Private Sub Swap()
Dim x As String
Label1.Top = List1.Top + List1.Height / MAX * a
Label2.Top = List1.Top + List1.Height / MAX * b
TTT = 0
Timer1.Enabled = True
End Sub

Private Sub Command1_Click()
Dim i As Integer
Dim j As Integer
MAX = 10
List1.Clear
For i = 1 To 10
List1.AddItem Int(Rnd * 100 + 1)
Next i

For i = 0 To MAX - 2
For j = i + 1 To MAX - 1
If Val(List1.List(j)) < Val(List1.List(i)) Then
a = j
b = i
Swap
flag = True
While flag
DoEvents
Wend
End If
Next j
Next i

End Sub

Private Sub Form_Load()
Randomize Timer
Label1.Left = List1.Left - Label1.Width
Label2.Left = List1.Left - Label2.Width
Label1.Visible = False
Label2.Visible = False
End Sub

Private Sub Form_Unload(Cancel As Integer)
End
End Sub

Private Sub Timer1_Timer()
Dim x As String
TTT = TTT + 1
If TTT < 10 Then
Label1.Visible = True
Label2.Visible = True
Label1.BackColor = RGB(Rnd * 255, Rnd * 255, Rnd * 255)
Label2.BackColor = RGB(Rnd * 255, Rnd * 255, Rnd * 255)
End If
If TTT = 10 Then
Label1.Visible = False
Label2.Visible = False
x = List1.List(a)
List1.List(a) = List1.List(b)
List1.List(b) = x

End If
If TTT > 12 Then
Timer1.Enabled = False
flag = False
End If

End Sub追问

能看下form吗,我试了不对

追答

创建Text1 控件数组 index 0 ~ 5
一个Command 一个 timer timer 间隔 300毫秒 Enable=false

Option Explicit
Dim a(6) As Integer
Dim flag As Boolean
Dim x As Integer
Dim y As Integer
Dim t As Integer

Private Sub swap()
t = 0
Timer1.Enabled = True
flag = True
While flag
DoEvents
Wend
End Sub

Private Sub Command1_Click()
Dim i As Integer
Dim j As Integer
Dim temp As Integer
For i = 0 To 5
a(i) = Val(Text1(i).Text)
Next i

For i = 0 To 4
For j = i + 1 To 5
If a(j) < a(i) Then
temp = a(j)
a(j) = a(i)
a(i) = temp
x = i
y = j
swap
End If
Next j
Next i
End Sub
Private Sub Form_Load()
Dim i As Integer
For i = 0 To 5
Text1(i) = 6 - i
Next i
End Sub

Private Sub Timer1_Timer()
Dim temp As Integer
If t Mod 2 = 0 Then
Text1(x).BackColor = vbRed
Text1(y).BackColor = vbBlue
Else
Text1(x).BackColor = vbBlue
Text1(y).BackColor = vbRed
End If
t = t + 1
If t = 8 Then
t = 0
Timer1.Enabled = False
flag = False
temp = Text1(x)
Text1(x) = Text1(y)
Text1(y) = temp
Text1(x).BackColor = vbWhite
Text1(y).BackColor = vbWhite
End If
End Sub