冒泡排序

已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。再比较a[2]与a[3]的值,若a[2]大于a[3]则交换两者的值,否则不变。再比较a[3]与a[4],以此类推,最后比较a[n-1]与a[n]的值。这样处理一轮后,a[n]的值一定是这组数据中最大的。再对a[1]~a[n-1]以相同方法处理一轮,则a[n-1]的值一定是a[1]~a[n-1]中最大的。再对a[1]~a[n-2]以相同方法处理一轮,以此类推。共处理n轮后a[1]、a[2]、……a[n]就以升序排列了。

降序排列与升序排列相类似,若a[1]小于a[2]则交换两者的值,否则不变,后面以此类推。 总的来讲,每一轮排序后最大(或最小)的数将移动到数据序列的最后,理论上总共要进行n(n-1)/2次交换。

如下原序列:

Index:i

0

1

2

3

4

 Ri

7

9

15

6

2

 

第0(i=0)次,比较R0~Rn-i,即R0~R4;

If(R0<R1)=true;

If(R1<R2)=true;

If(R2<R3)=false =>swap(R2,R3)=>

Index:i

0

1

2

3

4

 Ri

7

9

6

15

2

 

 

 

If(R3<R4)=false =>swap(R3,R4)=>

Index:i

0

1

2

3

4

 Ri

7

9

6

2

15

 

 

 

第1(i=1)次,比较R0~Rn-i,即R0~R3;

第2(i=2)次,比较R0~Rn-i,即R0~R2;

第3(i=3)次,比较R0~Rn-i,即R0~R1;

 

根据以上分析,可以得到伪代码如下:

for(int i=0;i<n;++i)

{

 for(j=0;j<n-i-1;++j)

  {

   if(Rj>Rj+1)swap(Rj,Rj+1);

  }

}

如果在某一轮两两比较中都不需要进行交换,说明序列已排好序,因此我们可以得到优化的冒泡排序法如下:

int swapcount=0

for(int i=0;i<n;++i)

{

 for(j=0;j<n-i-1;++j)

  {

   if(Rj>Rj+1)

    {

     swap(Rj,Rj+1);

     swapcount+=1;

     }

  }

 if(swapcount==0)break;//stop comapring and swapping

}

代码如下:

http://download.youkuaiyun.com/detail/mochounv/9691113

BubbleSort(T[]source)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值