已知一组无序数据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)