冒泡法

冒泡法

  冒泡法的思路是:每次将相邻的两个数作比较,把较小的调到前头。
若有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;
}

运行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值