精讲冒泡排序(C语言)。

前言:
此篇采用C语言,通过一道例题精讲冒泡排序(起泡排序)。

冒泡排序:
每次将相邻两个数比较,将小的调到前头。
eg:
若有6个数:9,8,5,4,2,0。

第1趟先将最前面的两个数8和9对调 (见图6.3)。第2次将第2次将第2和第3个数(9和5)对调……如此进行5次,得到 8-5-4-2-0-9 的顺序,可以看到:最大的数9已“沉底”,成为最下面一个数,而小的数“上升”。最小的数0已向上“浮起”一个位置。经过第1趟(共5次比较与交换)后,已得到最大的数9。

第2趟,对余下的前面5个数(8,5,4,2,0)进行新一轮的比较,以便使次大的数“沉底”。按以上方法进行第2趟比较,见图6.4。经过这一趟4次比较与交换,得到次大的数8。
在这里插入图片描述
按此规律进行下去,可以推知,对6个数要比较5趟,才能排好序。在第1趟中要进行两个数之间的比较共5次,在第2趟过程中比较4次……第5趟只须比较1次。

如果有n个数,则要进行 n-1 趟比较。在第1趟比较中要进行 n-1 次两两比较,在第 j 趟比较中要进行 n-j 次两两比较。

请读者分析排序的过程,原来0是最后一个数,经过第1趟的比较与交换,0上升为第5个数(最后第2个数)。再经过第2趟比较与交换,0上升为第4个数(最后第3个数)。再经过第3趟比较与交换,0上升为第3个数……每经过一趟的比较与交换,最小的数“上升”一位,最后升到第一个数。这如同水底的气泡逐步冒出水面一样,故称为“冒泡法”或“起泡法”。

据此画出流程图(见图6.5
在这里插入图片描述
题目详情:
有10个地区的面积,要求对它们按由小到大的顺序排列。

解题思路:
这种问题称为数的排序。排序的规律有两种:一种是 升序 ,从小到大;另一种是 降序 ,从大到小。可以把这个题目抽象为一般形式“对n个数按升序排序”。

代码实现:

#include<stdio.h>
int main() 
{
	int a[10];
	int i,j,t;
	printf("input 10 numbers :\n");
	for(i=0; i<10; i++)
		scanf("%d",&a[i]);
	printf("\n");
	for(j=0; j<9; j++)						//进行9次循环,实现9趟比较 
		for(i=0; i<9-j; i++)				//在每一趟中进行9-j次比较 
			if(a[i]>a[i+1]) 				//相邻两个数比较 
			  {t=a[i];a[i]=a[i+1];a[i+1]=t;}
	printf("the sorted numbers :\n");
	for(i=0; i<10; i++)
		printf("%d ",a[i]);
	printf("\n");
	return 0;
}

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

程序分析:
程序中实现冒泡排序算法的主要是10~13行。当执行外循环第1次循环时,j=0,然后执行第1次内循环,此时 i=0,再 if 语句中将 a[i] 和 a[i+1] 比较。执行第2次内循环时,i=1,a[i] 和 a[i+1] 比较,就是将 a[8] 和 a[9] 比较。这时第1趟过程完成了。

当执行第2次外循环时,j=1,开始第2趟过程。内循环继续的条件是 i<9-j,由于j=1,因此相当于i<8,即 i 由0编导7,要执行内循环 8 次。其余类推。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超级Mr Yin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值