内容正文:
专题3 冒泡排序算法及VB程序实现
一、基本思想(以升序、从后往前比较为例)
通过相邻元素的比较,将较小的数向上推移的排序技术。
n个数需要通过n-1轮冒泡。第i轮的任务是将第i小的数推移到a(i)。
二、核心代码(升序)
1. 从后往前,小数往前冒(默认写法,需要在理解的基础上熟记)
For i = 1 To n - 1 '外层循环表示排序轮数
For j = n To i + 1 Step -1 '注意j的初值和终值
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
2. 从前往后,大数向后沉
For i = 1 To n - 1 '外层循环表示排序轮数
For j = 1 To n-i '注意j的初值和终值
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
3. 当某一轮冒泡排序没有任何数据交换,则说明数组已然有序,后面的轮次可以省略,证明如下:假设数组已进行了i-1遍冒泡,在进行第i遍冒泡时,没有相邻元素交换,那么a(n)>=a(n-1)>=....>=a(i+1)>=a(i),这说明数组无序部分也已有序,从而整个数组已完成排序(见下面示意图)。
a(1)
a(2)
......
a(i-1)
a(i)
......
a(n-1)
a(n)
无序部分
有序部分
基于此,得到改进后的冒泡排序程序段(以从后往前为例)。
For i = 1 To n - 1
Flag=True '内层循环之前没有相邻数据的交换
For j = n To i + 1 Step -1
If a(j) < a(j - 1) Then
t = a(j):a(j) = a(j - 1):a(j - 1) = t
flag=False '有了相邻数据的交换,改变标记变量
End If
Next j '内层循环结束后,判断第i轮是否有