二,冒泡排序
冒泡排序的基本思想是:每次比较两个相邻的元素,如果他们的顺序不满足要求就把它们的位置调换。
每一次循环都能将未比较的最小的数放到后面
例如需要将33,12,55,43,71这五个数从大到小排列
33 12 55 43 71 ——>33 12 55 43 71——>33 55 12 43 71 ——>33 55 43 12 71——>33 55 43 71 12
第一轮循环结束时就得到了这个结果,12已经到达了最后面 ,一共进行n-1(假设有n个数)趟循环就能够完成排序.
int main()
{
int a[100],i,j,t;
printf("请输入有多少个数需要排序");
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]); //循环读入n个数到数组a中
for(i=1;i<=n-1;i++) //n个数排序,只需进行n-1趟
for(j=1,j<=n-i;j++)
{
if(a[j]<a[j+1])
{ //交换
t=a[j+1];
a[j+1]=a[j];
a[j]=t;
}
}
for(i=1;i<=n;i++){
printf("%d",a[i]); //输出结果
}
return 0;
}
问题引申:若是想输出的不是分数,而是分数对应的人,进行排名
code如下:
#include <stdio.h>
struct student
{
char name[15];
int score;
}; //这里创建了一个结构体用来存储姓名和分数
int main()
{
struct student a[11],t;
int i,j,n;
scanf("%d",&n); //输入总数
for(i=1;i<=n;i++)
scanf("%s %d",a[i].name,&a[i].score); //读入n个人的姓名和分数
//按分数从高到低排序
for(i=1;i<=n;i++)
for(j=1;j<=n-i;j++)
{
if(a[j].score<a[j+1].score){
t=a[j+1].score;
a[j+1].score=a[j].score;
a[j].score=t;
}
}
for (i=1;i<=n;i++)
printf("%s\n",a[i].name); //输出人名
return 0;
}