前言:
此篇采用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 次。其余类推。