小哼的班上只有 5 个同学,这 5 个同学分别考了 5 分、 3 分、5 分、 2 分和 8 分,哎考得真是惨不忍睹(满分是 10 分)。接下来将分数进行从大到小排序,
排序后是 8 5 5 3 2。
#include <stdio.h>
/*满分十分,就建立一个11个数据的数组,几分出现几次就在对应的数组下标加一
*最后,几分出现几次就按照排序方式打印几次
*/
int main(int argc, char const *argv[])
{
int socer[11];
int i,s,j,k;
for(j=0;j<10;j++)//数组清零
socer[j]=0;
for(i=0;i<5;i++)//依次输入五个数据
{
scanf("%d",&s);
socer[s]++;
}
for(j=0;j<=10;j++)//遍历数组,从小到大打印
{
for(k=0;k<socer[j];k++)//对应分数出现的次数
printf("%d ",j);
}
return 0;
}
指定输入数据个数:
#include <stdio.h>
int main(int argc, char const *argv[])
{
int book[1001];
int x,y,i,j,k,n;
printf("Input the number of data:
");
scanf("%d",&n);//要排序的个数
//先清空数组
for(i=0;i<1000;i++)
book[i]=0;
printf("Input data:
");
for(x=0;x<n;x++)//循环要排序的个数的次数
{
scanf("%d",&y);//获取数据
book[y]++;//对应下标+1
}
//开始按照排序方式打印
for(j=0;j<=1000;j++)//遍历数组打印(<=,否则1000不能打印)
{
for(k=0;k<book[j];k++)//book[j]是数字出现的次数,是几就打印几次
printf("%d ",j);//j就是对应的数字
}
return 0;
}
上面的方法非常浪费空间!例如需要排序数的范围是 0~2100000000 之间,那你则需要申请 2100000001 个变量,也就是说要写成 int a[2100000001]。因为我们需要用 2100000001 个“桶”来存储 0~2100000000 之间每一个数出现的次数。即便只给你 5 个数进行排序(例如这 5 个数是 1、1912345678、 2100000000、18000000 和 912345678),你也仍然需要 2100000001 个“桶”,这真是太浪费空间了!还有,如果现在需要排序的不再是整数而是一些小数,比如将
5.56789、 2.12,1.1、 3.123、 4.1234
这五个数进行从小到大排序又该怎么办呢?现在我们来学习另一种新的排序算法:冒泡排序。
冒泡排序:
排序:8 50 22 6 1 15 100 0 1000 999
原理:比较相邻的两位大小,1-2 2-3 3-4 4-5 …
如此循环n-1次可以将最大或者最小放到最后一位,再依次递减循环n-i次)i 代表已经被安排的个数
#include <stdio.h>
int main(int argc, char const *argv[])
{
int buf[100];
int empty;//用来互换时作为临时容器
int m,n,i,j,k;
printf("Input the num of data:
");
scanf("%d",&n);
printf("Input data:
");
for(i=0;i<n;i++)//循环n次,n 个数据
{
scanf("%d",&buf[i]);//把输入的数据存入数组
}
//冒泡排序:相邻互换,每安排一位数需要互换n-1次
for(k=0;k<(n-1);k++)//n个数排序,循环n-1次
{
for(j=0;j<(n-k);j++)//(n-k),k代表已经有k个数被安排好了
{
if(buf[j]<buf[j+1])//如果此位比后面的数小,互换
{
empty=buf[j+1];//把后面那位取出
buf[j+1]=buf[j];//互换
buf[j]=empty;//大的放前面
}
}
}
//打印
for(i=0;i<n;i++)//打印n次
{
printf("%d ",buf[i]);
}
return 0;
}
排序:
5个人的成绩
huhu 5
haha 3
xixi 5
hengheng 2
gaoshou 8
添加一个结构体,解决:
#include <stdio.h>
typedef struct student
{
char name[21];
int score;
};
int main(int argc, char const *argv[])
{
int i,j,n;
struct student stu[100],t;
printf("The num of data:
");
scanf("%d",&n);
printf("Input the data:
");
for(i=0;i<n;i++)
{
scanf("%s %d",&stu[i].name,&stu[i].score);
}
for(i=0;i<n-1;i++)//n个数据,循环n-1次
{
for(j=0;j<n-i;j++)
{
if(stu[j].score<stu[j+1].score)
{
t=stu[j+1];//t为结构体类型
stu[j+1]=stu[j];
stu[j]=t;
}
}
}
printf("result:
");
for(i=0;i<n;i++)
{
printf("%s--%d
",stu[i].name,stu[i].score);
}
return 0;
}