Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 1944|回复: 5

[已解决]VB解析冒泡排序为什么内循环要8-i

[复制链接]
发表于 2017-4-29 19:41 | 显示全部楼层 |阅读模式
本帖最后由 laoau138 于 2017-4-29 21:31 编辑

VB解析冒泡排序为什么内循环要8-i


输入8个数字,从小到大,用冒泡排序


Dim a(10) As Integer

Private Sub Command1_Click()
  For i = 1 To 8
    x = Int(90 * Rnd) + 10
    a(i) = x
    Text1 = Text1 & x & "  "
  Next i
End Sub

Private Sub Command2_Click()
  For i = 1 To 7                '外循环,冒泡排序这一句有什么用
    For j = 1 To 8 - i          '内循环,冒泡排序这一句有什么用  为什么要8-i,
      If a(j) > a(j + 1) Then
        t = a(j): a(j) = a(j + 1): a(j + 1) = t
      End If
    Next j
  Next i

  For i = 1 To 8
    Text2 = Text2 & a(i) & "  "
  Next i
End Sub

Private Sub Form_Load()
  Text1 = ""
  Text2 = ""
End Sub

最佳答案
2017-4-29 20:44

外循环控制内循环的范围,刚开始是数组内所有的元素。
内循环是逐个两两比较,取出最大值放最前面。等到下一次内循环比较的时候,最前面那个已经是最大了,要在剩下的元素里面再逐一比较最大的(所以8-i),放最前面。
这样通过外循环就一个一个写出来了



 楼主| 发表于 2017-4-29 19:41 | 显示全部楼层
回复

使用道具 举报

发表于 2017-4-29 20:44 | 显示全部楼层    本楼为最佳答案   

外循环控制内循环的范围,刚开始是数组内所有的元素。
内循环是逐个两两比较,取出最大值放最前面。等到下一次内循环比较的时候,最前面那个已经是最大了,要在剩下的元素里面再逐一比较最大的(所以8-i),放最前面。
这样通过外循环就一个一个写出来了



评分

参与人数 1 +9 收起 理由
laoau138 + 9 来学习

查看全部评分

回复

使用道具 举报

发表于 2017-4-29 21:07 | 显示全部楼层
本帖最后由 france723 于 2017-4-29 21:09 编辑

所有冒泡程序都大同小异,在仔细解释一下为什么要两个循环。比如有这么一个数组"11,13,5,18,7", 我们从小到大排列。 首先是内循环,两个两个的逐一比较,把较大的放后面,第一组比较“11”和“13”,顺序不用变。第二组比较“13”和“5”,顺序改变成“5,13”,此时数组顺序是"11,5,13,18,7"。以此类推,最后数组顺序是“11,5,13,7,18”。

内循环把最大的“18”放在了最后面,但是前面的元素由于是两两比较,所以并没有准确的按照从小到大排列。这时候我们需要把除了最大的元素“18”(放在了最后面)的剩余元素,再运行一次内循环,找出剩余元素最大的,然后放在最后面。以此类推,直到达到要求。
这个过程要把已经找出之前最大的元素排除(这就是你问的为什么8-i),所以要运用一个外循环来控制内循环每次的循环范围。

评分

参与人数 3 +22 收起 理由
ioi_chan + 1 来学习
大灰狼1976 + 12 赞一个,小猫确实很聪明!
laoau138 + 9 来学习

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2017-4-29 21:31 | 显示全部楼层
france723 发表于 2017-4-29 20:44
外循环控制内循环的范围,刚开始是数组内所有的元素。
内循环是逐个两两比较,取出最大值放最前面。等到 ...

你好聪明啊
回复

使用道具 举报

 楼主| 发表于 2017-4-30 09:11 | 显示全部楼层
france723 发表于 2017-4-29 21:07
所有冒泡程序都大同小异,在仔细解释一下为什么要两个循环。比如有这么一个数组"11,13,5,18,7", 我们从小 ...

VB解析选择排序  内循环和外循环有什么用


10个数从小到大   用选择排序

Private Sub Command1_Click()
  Dim a(1 To 10) As Integer
  For i = 1 To 10
    a(i) = Int(100 * Rnd)
    Print a(i);
  Next i
  Print
  For i = 1 To 9         '外循环,选择排序这一句有什么用
    k = i
    For j = i + 1 To 10        '内循环,选择排序这一句有什么用  为什么要j=i+1, to  10
      If a(j) < a(k) Then k = j
    Next j
    t = a(i): a(i) = a(k): a(k) = t
  Next i
  Print "排序以后的数:"
  For i = 1 To 10
    Print a(i);
  Next i
  Print
End Sub

http://www.excelpx.com/thread-429805-1-1.html


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-26 04:03 , Processed in 0.220071 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表