冒泡法疑问之群聚中原论循环!!!欢迎大家进来讨论,来者给分,乏高手则失意!

onjl 2004-03-17 01:24:42
首先谢谢大家的捧场!小弟此乃三生有幸啊啊,小弟最近做个作业时,遇到个冒泡的循环啊,循环下面这样的!可是偶就是没能理解透,哎,笨就一个字,由于学VB才不多久,所以还请个位大侠能给我点提示,解答,小第感激不尽了!!!
For I = 0 To 3
lngTmp = mz(I)
If I <= 2 Then
For J = I + 1 To 3
If mz(J) > lngTmp Then
mz(I) = mz(J)
mz(J) = lngTmp
lngTmp = mz(I)
End If
Next
End If
strR = strR & " " & CStr(lngTmp)
Next

比如我们填了四个数字 5.8.10.6
那么这个循环是排列循序的,用的是冒泡法,相信大家很熟悉,可是我熟悉不理解,没办法!
我的问题是这样的,他们是怎么做比较的呢,我就想了一个早上不理解,他是怎么比较的,然后排列好顺序的,!你们能解释一下我听么?最好有上面我提的那4个数字,他们都是怎么相互比较的,然后排出顺序的行么?谢谢个位大哥,小第感激不尽!!!!
...全文
134 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
onjl 2004-03-17
  • 打赏
  • 举报
回复
真的,非常非常感谢大家,真的不好意思,各位了,我就这点分数,真的想给你们多点,偶也是不常来的,所以就100分能分大家了,真的如果多点,我宁愿分多点大家,真的很感谢你们的无私帮助,我再次谢过了,我不会忘记你们的,CSDN的朋友们,!
daisy8675 2004-03-17
  • 打赏
  • 举报
回复
在vb中處理冒泡此類問題,可以借助數據庫和別得控件很容易實現。

要知道機器是死得,但是人是活得。

要1加到100,不要去循環,用(1+100)*50/2就行了
同理,要比較大小,你可以先排進數據庫,然後去出來order by就行了

以前好玩給別人做了個測試得,今天找不到代碼了...
danielpan 2004-03-17
  • 打赏
  • 举报
回复
呵呵,别老想着代码,先把原理搞清楚,然后印证代码看就好多拉.
冒泡的方法是怎样的前面已经有很多人说了,我就不重复了.
你的问题卡在这里了:小(大)的数是怎么"浮"上去的?
比如a(=8),b(=5)这两个数,现在我要把5浮上去,也就是要变成a=5,b=8.
我们一般是用一个临时变量,把两个比较的数作一下交换.具体的步骤一般是
temp=a;a=b;b=temp;
这样两个变量a和b就交换了数据,也就是冒泡里面的浮了一个位置.

现在再来看你的代码,你的代码和我写的有点不一样,不过功能是一样的.
你的变量LngTmp是用来保存一次比较中较大的那个数,以便于下次比较.
首先是If mz(J) > lngTmp ,这里把mz(j)和前面比较时最大的那个数比较,如果mz(j)大则把这个数换到前面去(你这里的冒泡有点和我讲的不一样,我讲的是相邻的数交换,你是直接和要换到的位置上的数去交换,比如说第一大的数就和第一个数比较,第2大的数就和第2个数比较).
mz(I) = mz(J)
mz(J) = lngTmp
这里就是交换拉,记住lngTmp前面已经赋过值拉.

lngTmp = mz(I),这就是把大的那个数留下来
RUKYO 2004-03-17
  • 打赏
  • 举报
回复
if 8>5 then
mz(0)=8 'mz(I) = mz(J)
mz(1)=5 'mz(J)=LngTmp ,其实执行这两句的作用是把大数往上移,小数则和它交换位置
LngTmp = mz(0) '之后把交换变量换成大数,他和你的小数向上浮只是方向相反但效果一样
rainstormmaster 2004-03-17
  • 打赏
  • 举报
回复
http://student.zjzk.cn/course_ware/data_structure/web/paixu/paixu8.3.1.1.htm
onjl 2004-03-17
  • 打赏
  • 举报
回复
非常感谢你
回复人: ljfwarrior(我爱Java)
谢谢你,不过我还是有点不明白,能在解释一下么?
For J = I + 1 To 3
If mz(J) > lngTmp Then
mz(I) = mz(J)
mz(J) = lngTmp
lngTmp = mz(I)
根据上面的mz(0)=5 mz(1)=8
那么下面是上面的翻译
if 8>5 then
mz(0)=5 mz(1)=8 ‘这句不知道理解对了么?
mz(J)=LngTmp '这句还不理解
lngTmp=mz(I) ’这句还是不理解


请你在详细告诉一下我行么?谢谢了,我真的很感动你的不懈赐教,可是我太笨,谢谢哥哥!
onjl 2004-03-17
  • 打赏
  • 举报
回复
还是不太理解啊,哎!!!!我好笨
weiwei19800706 2004-03-17
  • 打赏
  • 举报
回复
For I = 0 To 2
For J = I + 1 To 3
If mz(J) > lngTmp Then
lngTmp = mz(I)
mz(I) = mz(J)
mz(J) = lngTmp

End If
Next
End If
strR = strR & " " & CStr(lngTmp)
Next
ljfwarrior 2004-03-17
  • 打赏
  • 举报
回复
楼主的程序是从开头开始排序,轻的向下沉.与我上面说的相反了,不过原理是一样的啊!!
If mz(J) > lngTmp Then
mz(I) = mz(J)
mz(J) = lngTmp
lngTmp = mz(I)
我来解释一下这四句:
像5,8,10,6.
你把这四个数看作放在四个有顺序的盒子里了.编号分别为0,1,2,3
比如这时I=0
执行 For J = I + 1 To 3
If mz(J) > lngTmp Then
mz(I) = mz(J)
mz(J) = lngTmp
lngTmp = mz(I)
'''''''''''''''''''''''''''''''''''''''''''
lngTmp=mz(I)由于I=0,也就是lngTmp就等于放在盒子0里的数5了
这时mz(J)就是盒子1的数8,If mz(J) > lngTmp Then这语句就是比较一下
盒子1里的数与盒子2的数哪一个大, mz(I) = mz(J):mz(J) = lngTmp这两条语句
可能看作这样,哪一个盒子里的数小就把它搬到盒子2,那么大的数当然搬去盒子1
了.lngTmp=mz(I),是把盒子2的数放到lngTmp这个变量中,让它再与第三个盒子比较.
接下来的原理都是一样了.





ljfwarrior 2004-03-17
  • 打赏
  • 举报
回复
方法叫做冒泡法。从方法名就可能理解到轻的东西就向上浮了。
例如楼主的5,8,10,6
从后面开始比较:
(1)10与6比较,由于6轻(小),所以6向上浮一位,这时变为5,8,6,10.再由8与6比较,也是6轻,向上浮一位,这时变为5,6,8,10.再由5与6比较,由于6比5重,所以6这次没有上浮。这一次从后扫描上来得出的结果是5最轻,排在第一位。
(2)得出5,6,8,10.其实第二次是对6,8,10进行排序,因为5已经被确定是最轻的了.就不用排了.
(3).......
其实一共要排n-1次,每一次都是找出最轻的排在前面.
看了看上面的帖,我这个与你们的不同,我这个是把数列从小到大排列,也是冒泡法思想.希望楼主能看明白.
楼主这个程序不是太好,象排5,8,10,6.这个数列要排4-1次,也就是3次了.其实这个排一次就排好了,其他两次大大地浪费了时间.以下是我的一个用C写的冒泡法程序,设置了一个noswap的"哨兵",如果在某一次循环中所有数都没有交换过位置,证明已经排好序了,也就退出循环.
void Bubblesort(rectype R[n])
{int i,j ,noswap;
rectype temp;
for(i=0;i<n-1;i++)
{noswap=1;
for(j=n-1;j>=i;j--)
if(R[j].key<R[j-1].key)
{temp=R[j];
R[j]=R[j-1];
R[j-1]=temp;
noswap=0;
}
if(noswap) break;
}
}
onjl 2004-03-17
  • 打赏
  • 举报
回复
If mz(J) > lngTmp Then
mz(I) = mz(J)
mz(J) = lngTmp
lngTmp = mz(I)

这三句还不太理解啊!你们能在解释一下么?和上面的和不上啊!
比如我们简单说吧
mz0=5 mz1=8
如同上面的,我是这样写的
if mz(1)>mz(0) then
那下面那三句怎么理解了,你们能就这四句和我上面提的例子直接给我个解释么?最好不要脱离我的这个例子,行么?谢谢
onjl 2004-03-17
  • 打赏
  • 举报
回复
我明天下午揭贴吧,希望大家体谅一下,谢谢!

真的很感谢这里的各位朋友,谢谢你们,你们真的很热心,特别特别感谢回复人:

julysixth(C#不会的找我...)真的,谢谢你,你说的真的很详细,我册地明白了!谢谢
onjl 2004-03-17
  • 打赏
  • 举报
回复
m0=10 m1=18 m2=5 m3=7 m4=6 m5=8 m6=2 m7=9

if m0<m1 then m0=18 m1=10
if m0<m2 then m0=18 m2=5
if m0<m3 then m0=18 m3=7
if m0<m4 then m0=18 m4=6
if mo<m5 then m0=18 m5=8
if m0<m6 then m0=18 m6=2
if m0<m7 then m0=18 m7=9
现在m0=18 m1=10 m2=5 m3=7 m4=6 m5=8 m6=2 m7=9
if m1<m2 then m1=10 m2=5
if m1<m3 then m1=10 m3=7
if m1<m4 then m1=10 m4=6
if m1<m5 then m1=10 m5=8
if m1<m6 then m1=10 m6=2
if m1<m7 then m1=10 m7=9
现在m0=18 m1=10 m2=5 m3=7 m4=6 m5=8 m6=2 m7=9
if m2<m3 then m2=7 m3=5
if m2<m4 then m2=7 m4=6
if m2<m5 then m2=8 m5=7
if m2<m6 then m2=8 m6=2
if m2<m7 then m2=9 m7=8
现在m0=18 m1=10 m2=9 m3=5 m4=6 m5=7 m6=2 m7=8
if m3<m4 then m3=6 m4=5
if m3<m5 then m3=7 m5=6
if m3<m6 then m3=7 m6=2
if m3<m7 then m3=8 m7=7
现在m0=18 m1=10 m2=9 m3=8 m4=5 m5=6 m6=2 m7=7
if m4<m5 then m4=6 m5=5
if m4<m6 then m4=6 m6=2
if m4<m7 then m4=7 m7=6
现在m0=18 m1=10 m2=9 m3=8 m4=7 m5=5 m6=2 m7=6
if m5<m6 then m5=5 m6=2
if m5<m7 then m5=6 m7=5
现在m0=18 m1=10 m2=9 m3=8 m4=7 m5=6 m6=2 m7=5
if m6<m7 then m6=5 m7=2
现在m0=18 m1=10 m2=9 m3=8 m4=7 m5=6 m6=5 m7=2

哈哈,你头晕了吧,哈哈!我自己都晕了,天啊,哼~~~~
Zedee 2004-03-17
  • 打赏
  • 举报
回复
可以在每次循环完毕时输出一次结果
这样要是再看不懂的话...
julysixth 2004-03-17
  • 打赏
  • 举报
回复
对的.第一次循环后一定是找出的最大的一个数,最大的数在第2个循环的时候就不会再参与比较了.
华芸智森 2004-03-17
  • 打赏
  • 举报
回复
冒泡法排序在一个数组的元素内循环执行,比较相邻的无素并判断它们的次序是否正确如果次序不正确就交换两个元素的位置在紫数组中,排序循环执行直到滑动轴承元素被交换位置为止,这就说明整个数组排序结束了.
onjl 2004-03-17
  • 打赏
  • 举报
回复
m0=5 m1=8 m2=10 m3=6

if m0<m1 then m0=8 m1=5
if m0<m2 then m0=10 m2=8
if m0<m3 then m0=10 m3=6
现在是m0=10 m1=5 m2=8 m3=6
if m1<m2 then m1=8 m2=5
if m1<m3 then m1=8 m3=6
现在是m0=10这个固定最大了,不变了哈,m1=8 m2=5 m3=6
if m2<m3 then m2=6 m3=5
现在是m0=10 m1=8 m2=6 m3=5

对的吧,是这样吧!
northwolves 2004-03-17
  • 打赏
  • 举报
回复
try:

Private Sub Command1_Click()
sort "1,2,3,4,5,6,7,8,9"
End Sub
Sub sort(ByVal x As String)
Debug.Print x
Dim a, i As Long, j As Long, temp As Double
a = Split(x, ",")
For i = 0 To UBound(a) - 1
For j = i + 1 To UBound(a)
temp = CDbl(a(i))
If CDbl(a(j)) > temp Then
a(i) = a(j)
a(j) = temp
End If
Debug.Print Space(Len(x) \ 2 - 1) & "↓" & vbCrLf & Join(a, ",")
Next
Next
Erase a
End Sub
vbfunner 2004-03-17
  • 打赏
  • 举报
回复
先申明我不懂冒泡是个什么东西啊!说的不对你也要原谅哦!!I=0时lngtmp=mz(0)
然后到j ,当mz(1)>mz(0)时 mz(0)=mz(1)即第0项变为第一项啦然后lngtmp=mz(0)就是lngtmp是比较大的一个值啦!地一项的值为0项的值`如果j=2时mz(1)<mz(2)第二项就变为较小的一项拉!依此类推就是由大到小排列啦!对吧!
Chuanyan 2004-03-17
  • 打赏
  • 举报
回复
5,8,10,6
=>10,5,8,6
5,8,6
=>8,5,6
5,6
=>6,5
加载更多回复(4)

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧