例7.3用起泡法对10个数排序(由小到大)。
起泡法的思路是:将相邻两个数比较,将小的调到前头。见图7.1。
若有6个数。第一次将8和9对调,第二次将第2和第3个数(9和5)对调……如此共进行5次,得到854209的顺序,可以看到:最大的数9已“沉底”,成为最下面一个数,而小的数“上升”。最小的数0已向上“浮起”一个位置。经第一趟(共5次)后,已得到最大的数。然后进行第二趟比较,对余下的前面5个数按上法进行比较,见图7.2。经过4次比较,得到次大的数8。如此进行下去。可以推知,对6个数要比较5趟,才能使6个数按大小顺序排列。在第一趟中要进行两个数之间的比较共5次,在第二趟中比4次……第5趟比1次。如果有n个数,则要进行n-1趟比较。在第1趟比较中要进行n-1次两两比较,在第j趟比较中要进行n-j次两两比较。据此画出流程图(见图7.3)。根据流程图写出程序(今设n=10),定义数组长度为11,本例中对a[0]不用,只用a[1]到a[10],以符合人们的习惯。
main()
{
int a[11];
int i,j,t;
printf("inPut 10 numberS,\n");
for (i=1;i<11;i++)
scanf("%d",&a\[i\]);
printf("\n");
for(j=1;j<=9;j++)
for(i=1;i<=10-j;i++)
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=1;i<11;i++)
printf("%d ",a[i]);
}
运行情况如下:
inPut 10 numberS:
1 0 4 8 12 65 -76 100 -45 123
the sorted numberS:
-76 -45 0 1 4 8 12 65 100 123