排序方法是一种重要的,基本的算法。起泡法的基本思路是:每次将相邻的两个数进行比较,将小的调到前面。若有六个数:9,8,5,4,2,0,可以按照下图方式进行对调排序。
第一趟比较先将第一个数9与第二个数8对调,再将第二个数9与第三个数5对调,进行五此后可以得到854209,最大的9已“沉底”,最小的数0已“浮起”。然后第二趟比较再将余下的五个数进行新一轮比较。按照规律进行下去n个数比较n-1次比较,n个数比较时第m趟需要n-m次比较,这种如水底的旗袍冒出水面一样的方法称为起泡法。
我们可以根据此画出流程图并据此写出程序(设n=10)
#include <stdio.h>
int main()
{
int a[10];
int n,m,k;
printf("input 10 numbers:\n");
for(n=0;n<10;n++)
scanf("%d",&a[n]);
for(m=0;m<9;m++) //进行九次循环,实现九次比较
for(n=0;n<9-m;n++) //在每次循环中进行9-m次比较
if(a[n]>a[n+1]) //相邻两数比较
{
k=a[n];a[n]=a[n+1];a[n+1]=k; //将大的数放到后面
}
printf("the sorted numbers:\n");
for(n=0;n<10;n++)
printf("%d ",a[n]);
return 0;
}
输出结果:
程序分析:执行第一次外循环时,m=0,随后执行第一次内循环,此时n=0,在if语句中将a[0]与a[1]进行比较,执行第二次内循环将a[1]与a[2]进行比较,直到a[8]和a[9]比较后第一趟内循环结束,进行第二次外循环,以此类推。
同样的,我们也可以使用起泡法对字符进行排序
#include <stdio.h>
#include <string.h>
#define N 10
char str[N];
int main()
{
void sort(char[]); //声明函数
int i,flag;
for(flag=1;flag==1;)
{
printf("input string:\n");
gets(str);
if(strlen(str)>N)
printf("string too long,input again!");
else
flag=0; //退出循环体
}
sort(str);
printf("string sorted:\n");
for(i=0;i<N;i++)
printf("%c",str[i]);
printf("\n");
return 0;
}
void sort(char str[])
{int i,j;
char t;
for(j=1;j<N;j++) //与上例相同
for(i=0;i<N-j;i++)
if(str[i]>str[i+1])
{t=str[i];
str[i]=str[i+1];
str[i+1]=t;
}
}
输出结果:
这就是起泡法的大致流程,排序的算法有很多,重要的是要了解和掌握解题思路,学会分析问题,建立算法,以及如何利用c语言的编程的技巧。