VB的冒泡法排序

来源:百度知道 编辑:UC知道 时间:2024/05/16 20:29:52
对含有5个元素(1 to 5) 的一维数组排序,用了以下的代码(冒泡法)
For s = 1 To 4
For b = s To 4
If a(b) > a(b + 1) Then f = a(b): a(b) = a(b + 1): a(b + 1) = f
Next b
Next s
但是运行的结果就是错误的。。。为什么。。。望大虾指教。。
1楼的说清楚点嘛。。。。。。
什么叫做“冒泡法不只是相邻两个换位置而已”
还有,你下面的代码我用进去,错得更厉害-_-||| ,排出来的数列的元素跟原来的不符合。。比如说
48 83 45 68 79 运行之后变成 48 83 83 83 83
:(!

冒泡法是什么?一次又一次把序列中*所有*项按大小比较。

LZ的算法中,内嵌循环有问题,应该从1开始而不是s。

修改后可以得到正确答案:

For s = 1 To 4
For b = 1 To 4
If a(b) > a(b + 1) Then f = a(b): a(b) = a(b + 1): a(b + 1) = f
Next b
Next s

再优化一下,由于每次大循环都把一个最大的数送到末尾,那么小循环到 5-s 就完全可以停止了。

下面的更快:

For s = 1 To 4
For b = 1 To 5 - s
If a(b) > a(b + 1) Then f = a(b): a(b) = a(b + 1): a(b + 1) = f
Next b
Next s

当然是错的
冒泡法不只是相邻两个换位置而已...
应该再设个变量:
min=s(1)
For s = 1 To 4
For b = s To 5
If min > a(b) Then f = min: min = a(b): a(b) = f
next b
a(s)=min
这样才是每次b循环都先出一个最小的数
这样试试看~
冒泡排序有两种思路,一种是和你一样两两的换,就像你这样的:5 6 4 8,b内第一次循环后顺序是:5 4 6 8,这种要两个循环都完以后才排好序,还一种是第次一个内循环完后都将最小/最大的数移到最前...更快

for s = 4 to 1 step -1
for b = 0 to s -1
if a(b) > a(b+1) then
f = a(b):a(b) = a(b+1):a(b+1)=f
end if
next b
next s