VB中的For循环的问题
在Form1中画四个文体框及一个命令按扭,在四个文本框中各输入一个整数,组成一个数组,然后单击命令按钮,编写以下程序可使数组按升序排序,并在文本框中显示出来:Option...
在Form1中画四个文体框及一个命令按扭,在四个文本框中各输入一个整数,组成一个数组,然后单击命令按钮,编写以下程序可使数组按升序排序,并在文本框中显示出来:
Option Base 1
Private Sub Sort(a() As Integer)
Dim Start As Integer, Finish As Integer
Dim i As Integer, j As Integer, t As Integer
Start = LBound(a)
Finish = UBound(a)
For i = 4 To 2 Step -1
For j = 1 To 3
If a(j) > a(j + 1) Then
t = a(j + 1)
a(j + 1) = a(j)
a(j) = t
End If
Next j
Next i
End Sub
Private Sub Command1_Click()
Dim arr1
Dim arr2(4) As Integer
arr1 = Array(Val(Text1.Text), Val(Text2.Text), Val(Text3.Text), Val(Text4.Text))
For i = 1 To 4
arr2(i) = CInt(arr1(i))
Next i
Sort arr2()
Text1.Text = arr2(1)
Text2.Text = arr2(2)
Text3.Text = arr2(3)
Text4.Text = arr2(4)
End Sub
请问其中的For i = 4 To 2 Step -1的作用是什么,只用一层循环For i=1 to 4也可以使其按从小到大排序吧?这个双层循环怎么理解呢?
谢谢! 展开
Option Base 1
Private Sub Sort(a() As Integer)
Dim Start As Integer, Finish As Integer
Dim i As Integer, j As Integer, t As Integer
Start = LBound(a)
Finish = UBound(a)
For i = 4 To 2 Step -1
For j = 1 To 3
If a(j) > a(j + 1) Then
t = a(j + 1)
a(j + 1) = a(j)
a(j) = t
End If
Next j
Next i
End Sub
Private Sub Command1_Click()
Dim arr1
Dim arr2(4) As Integer
arr1 = Array(Val(Text1.Text), Val(Text2.Text), Val(Text3.Text), Val(Text4.Text))
For i = 1 To 4
arr2(i) = CInt(arr1(i))
Next i
Sort arr2()
Text1.Text = arr2(1)
Text2.Text = arr2(2)
Text3.Text = arr2(3)
Text4.Text = arr2(4)
End Sub
请问其中的For i = 4 To 2 Step -1的作用是什么,只用一层循环For i=1 to 4也可以使其按从小到大排序吧?这个双层循环怎么理解呢?
谢谢! 展开
展开全部
Step-1 表示每一步减1,也就是循环第一次是i=4,然后是i=3,i=2
这是称为“冒泡法”的排序方法,可以这样理解:
外循环表示需进行几轮比较,对4个元素进行比较排序,需要进行3轮比较,所以For i = 4 To 2 Step -1。
而内循环则可以这样说:
第一次是i=4,a(1)与a(2)、a(2)与a(3)、a(3)与a(4)进行比较,如果发现排列顺序不对,则交换位置,这样出了内循环之后,最大的元素会“沉”到最后一位成为新的a(4)。
而第二次则是i=3,在前三个元素中找到最大的(由于在上一个循环比较中a(4)已经是最大的了,所以就不需再拿a(4)出来比较,可将阁下的代码中内循环改为For j = 1 to i-1),把它沉到第三位成为新的a(3)。同理,第三次是在前两位进行排序。这样当循环结束后,最小的元素就如水泡往上冒一样,一步步冒到最上面来了。
楼上的yutuo5兄的内循环定义错了,应该是For j = 1 To i-1 的。
(由于本人疏忽,发表答复后进行了多次修改,深感抱歉。)
这是称为“冒泡法”的排序方法,可以这样理解:
外循环表示需进行几轮比较,对4个元素进行比较排序,需要进行3轮比较,所以For i = 4 To 2 Step -1。
而内循环则可以这样说:
第一次是i=4,a(1)与a(2)、a(2)与a(3)、a(3)与a(4)进行比较,如果发现排列顺序不对,则交换位置,这样出了内循环之后,最大的元素会“沉”到最后一位成为新的a(4)。
而第二次则是i=3,在前三个元素中找到最大的(由于在上一个循环比较中a(4)已经是最大的了,所以就不需再拿a(4)出来比较,可将阁下的代码中内循环改为For j = 1 to i-1),把它沉到第三位成为新的a(3)。同理,第三次是在前两位进行排序。这样当循环结束后,最小的元素就如水泡往上冒一样,一步步冒到最上面来了。
楼上的yutuo5兄的内循环定义错了,应该是For j = 1 To i-1 的。
(由于本人疏忽,发表答复后进行了多次修改,深感抱歉。)
展开全部
只用一层循环不能完成排序。比如数组为:
4321
一次排序后:3214
二次后:2134
三次后:1234
4321
一次排序后:3214
二次后:2134
三次后:1234
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先,只用一层是不可以的,当你的数据很特殊的时候还有可能
两个循环是一种变化后的冒泡算法
改成下面代码应该更好
For i = 4 To 2 Step -1
For j = 1 To i
If a(j) > a(j + 1) Then
t = a(j + 1)
a(j + 1) = a(j)
a(j) = t
End If
Next j
Next i
两个循环是一种变化后的冒泡算法
改成下面代码应该更好
For i = 4 To 2 Step -1
For j = 1 To i
If a(j) > a(j + 1) Then
t = a(j + 1)
a(j + 1) = a(j)
a(j) = t
End If
Next j
Next i
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
For i = 4 To 2 Step -1
就是从4到2,每次循环递减1的运算
就是从4到2,每次循环递减1的运算
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询