冒泡排序的基本思想

算法描述:

升序排列:从第一个元素开始,对数组中两两相邻的元素比较,将值较小的元素放在前面,值较大的元素放在后面,一轮比较完毕,一个最大的数沉底成为数组中的最后一个元素,一些较小的数如同气泡一样上浮一个位置。n个数,经过n-1轮比较后完成排序。

假定有下标为0nn+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=nj=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-1j=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-2j=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=1j=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

 

 

推导:ij的范围

基本思路:我不知道比较了多少轮,但是我知道从哪里开始,到哪里结束;我不知道比较了多少次,但是我知道从哪里开始,到哪里结束。

i来标记排序轮数,j来标记比较次数

i从小到大,第一轮标记为m,则i的范围可表示为:i=m to n-1,各轮j的范围:

第一轮:i=m  j=m to n-1

第二轮:i=m+1j=m to n-2

          

倒数二:i=n-2 j=m to m+1

最后轮:i=n-1 j=m to m

得出j初值始终为m,终值是个变化的量

但有规律,i每加1j的终值减1,和不变

i+j=m+n-1,得出j的终值为j=m+n-1-i

 

,第一轮标记为m+1,则i的范围可表示为:i=m+1 to n,各轮j的变化:

第一轮:i=m+1j=m to n-1

第二轮:i=m+2j=m to n-2

          

倒数二:i=n-1 j=m to m+1

最后轮:i=n  .j=m to m

得出j初值始终为m,终值是个变化的量

但有规律,i每加1j的终值减1,和不变

i+j=m+n,得出j的终值为j=m+n-i

 

 

 

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值