冒泡法
冒泡法
冒泡法的思路是:每次将相邻的两个数作比较,把较小的调到前头。
若有5个数a[0]~a[4]依次为 9-3-6-1-2.
第一趟:
a[0]和a[1]比较,9>3,互换位置,序列变成3-9-6-1-2;
a[1]和a[2]比较,9>6,互换位置,序列变成3-6-9-1-2;
a[2]和a[3]比较,9>1,互换位置,序列变成3-6-1-9-2;
a[3]和a[4]比较,9>2,互换位置,序列变成3-6-1-2-9;
可以看出第一趟一共比较了4次,结束后最大元素9已经就位(在数组最后),即a[4]=9。我们来看一下9的位置变化:
现在开始第二趟,目标是把第二大的元素归位:
a[0]和a[1]比较,3<6,不换位置,序列仍为3-6-1-2-9;
a[1]和a[2]比较,6>1,互换位置,序列变成3-1-6-2-9;
a[2]和a[3]比较,6>2,互换位置,序列变成3-1-2-6-9;
注意此时已经不需要再比较a[3]和a[4]了,因为第一趟已经确定a[4]是最大的数了,也就是说一共比较了3次;
那么第二趟结束后,序列变成3-1-2-6-9.
第三趟也是一样的,结束之后序列为1-2-3-6-9;
现在到了最后一趟,有的同学会问,不是已经排好了吗?我这里举的例子是个巧合,倘若换成其他的数,你试一试就知道了。我们已经知道,第一趟确定的是最大的数,第二趟确定的是次大的数,也就是说,一趟只能确定一个数,只能让一个数归位。换句话说,如果有n个数,我们就要比较n-1趟,在第j趟比较中,要进行n-j次。按照这个思想,第四趟结束之后,排序才真的完成,结果为1-2-3-6-9;
附上代码:
#include<stdio.h>
int main()
{
int a[5],i,j,t;
for(i=0;i<5;i++)
scanf("%d",&a[i]);
for(i=0;i<4;i++)
for(j=0;j<4-i;j++)
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
for(i=0;i<5;i++)
printf("%3d",a[i]);
printf("\n");
return 0;
}
运行结果