算法描述:
升序排列:从第一个元素开始,对数组中两两相邻的元素比较,将值较小的元素放在前面,值较大的元素放在后面,一轮比较完毕,一个最大的数沉底成为数组中的最后一个元素,一些较小的数如同气泡一样上浮一个位置。n个数,经过n-1轮比较后完成排序。
假定有下标为0~n的n+1个数的序列,要求按升序排列,实现的步骤如下:
(1)从第0个元素开始与后一个比较,如果比后大两元素交换,依次比较到第n个元素,最终将最大的数换入第n个元素中,a(n)不动
(2)重复(1) ,依次比较到第n-1个元素,最终将最大的数换入第n-1个元素中,a(n-1)不动
(3)重复(1) ,依次比较到第n-2个元素,最终将最大的数换入第n-2个元素中,a(n-2)不动
………………………………………
(n)a(0)与a(1)比较,如果a(0)大,与a(1)交换, a(0)最小
算法剖析:
(1)n+1个元素从头依次比较,冒出最大的元素到a(n), ...a(n)不动
a(0) a(1) a(2)…a(n-2) a(n-1) a(n),共做n次比较
(2) n个元素从头依次比较,冒出最大的元素到 a(n-1), .a(n-1)不动
a(0) a(1) a(2)…a(n-2) a(n-1), 共做n-1次比较
(3) n-1个元素从头依次比较,冒出最大的元素到a(n-2), .a(n-2)不动
a(0) a(1) a(2)…a(n-2), 共做n-2次比较
………………………………………
………………………………………
(n)2个元素比较,冒出最大的元素到a(1), . a(0)a(1)不动
a(0)a(1), 共做1次比较
共进行了n轮比较
显然这里涉及两个主要变量,冒泡轮数和比较次数,设从第1个元素开始比较直到把大数换到第i个元素为一轮,即每一轮最后一个元素记为i,比较次数由j的范围0~i-1决定,则有:
(第1轮)i=n:j=0 to n-1------------j=0 to i-1
a(0) a(1) a(2)…a(n-2) a(n-1) a(n),n+1个冒出a(n), .共做n次比较
(第2轮)i=n-1:j=0 to n-2---------j=0 to i-1
a(0) a(1) a(2)…a(n-2) a(n-1) ,n个冒出a(n-1), 共做n-1次比较
(第3轮) i=n-2:j=0 to n-3---------j=0 to i-1
a(0) a(1) a(2)…a(n-2) ,n-1个冒出a(n-2),共做n-2次比较
………………………………………
………………………………………
(第n轮)i=1:j=0 to 0---------------j=0 to i-1
a(0)a(1) ,2个冒出a(1), 共做1次比较
共进行了n轮比较
‘从数组a(0)~a(i)中冒出最大值,放到a(i)中(交换到)
‘冒出a(0) a(1) ..a(2)……a(i-2) a(i-1) a(i)中的最大值
‘ .a(j) a(j+1)a(j+2) . .a(i-2) a(i-1)
‘从第一个元素开始往后比较,把大数换到后边
‘没有参照物,直到最后一次a(i-1) a(i)比较,把大数换到a(i)。
for j=0 to i-1
if a(j)>a(j+1) then’这是升序
t=a(j)
a(j)=a(j+1)
a(j+1)=t
end if
next j
‘i从数组上界开始一直到下界+1,第二个
‘元素,每取一个i值就进行一轮比较
For i=n to 1 step -1 ‘如果用i=1 to n
for j=0 to i-1 ‘则有j=0 to n-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
‘如果不知道数组有多少个元素,可以用Lbound(a)和Ubound(a)得到:
m= Lbound(a):n= Ubound(a)
For i=n to m+1 step -1’如果用i=m+1 to n
for j=m to i-1 ‘则有 j=m to n+m-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
推导:i和j的范围
基本思路:我不知道比较了多少轮,但是我知道从哪里开始,到哪里结束;我不知道比较了多少次,但是我知道从哪里开始,到哪里结束。
用i来标记排序轮数,j来标记比较次数
i从小到大,第一轮标记为m,则i的范围可表示为:i=m to n-1,各轮j的范围:
第一轮:i=m: j=m to n-1
第二轮:i=m+1:j=m to n-2
… … …
倒数二:i=n-2: j=m to m+1
最后轮:i=n-1: j=m to m
得出j初值始终为m,终值是个变化的量
但有规律,i每加1,j的终值减1,和不变
i+j=m+n-1,得出j的终值为j=m+n-1-i
,第一轮标记为m+1,则i的范围可表示为:i=m+1 to n,各轮j的变化:
第一轮:i=m+1:j=m to n-1
第二轮:i=m+2:j=m to n-2
… … …
倒数二:i=n-1: j=m to m+1
最后轮:i=n: .j=m to m
得出j初值始终为m,终值是个变化的量
但有规律,i每加1,j的终值减1,和不变
i+j=m+n,得出j的终值为j=m+n-i