从大到小或从小到大输出
- 把一列数字,由小到大输出
- 把一列数字,由大到小输出
问题:
100分的试卷, 木头第一次考了94分
第二次考了67分
第三次考了43分
第四次考了94分
从小到到打印出每次木头的考试成绩。
⭐️✨⭐️ 程序不是一上来就敲代码,先构思你的算法,再去敲代码,并在代码中完善你的算法。
解题思路:
把100分 看成是100个桶,里面装的是相对应的分数,(94号桶里装的就是94分)
首先:初始状态,把这些桶全部设置为0。
考得的分数,就装进相应的桶中。
最后试考完了,把每个桶中考得分数的次数累加
并输出这些分数。
1.这些桶看成是里面有100个桶的一维数组。
(一维数组就是,把一些相同类型的数据排成一组,上面给出的分数数据是整型的,所以这个一维数组定义成int型)
2.定义三个角标
分别用来表示:分数、相同分数出现的次数、桶的编号。
3.把这些分数设置为0,表示还未考得过。
4.从键盘输入考了4次的成绩,存入相应的桶中。
5.计数,对相应编号的桶中放入分数。
6.接下将这些分数按照题目的要求从小到大或者是从大到小打印出来。
#include <stdio.h>
int main(){
int a[101],i,j,k; //定义成a[101]:里面存放的是0~100的分数,再定义三个变量,分别是:分数、分数出现的次数,存放分数的桶的编号
for(i=0;i<=100;i++)
a[i]=0; //把每个分数都设置为0,代表还未考得过。
for(i=1;i<=4;i++) // 从键盘上输入分数,输入的次数不得超过4次,因为木头就只考了4次
{
scanf("%d",&k); // 把这些分数放进相应的桶中
a[k]++; //计数 ,对对应为k的桶中放入一个分数
} //由两条语句构成的复合语句所以要用上花括号
for(i=100;i>=0;i--) //从大到小输出 的循环语句
for(j=1;j<=a[i];j++)//相同的分数出现几次就打印几次
printf("%d\n",i); //打印分数
return 0;
}
以上是从大到小的输出
把
for(i=100;i>=0;i–)
改成
for(i=0;i<=100;i++)
就是从小到大的输出
** 以上算法的核心思想是:好比有101个桶,编号从0到100。每出现一个分数,就放入相应编号的桶中,最后数数每个桶中有几个分数,并打印出来 **
这个算法有个缺点:很浪费空间
要输出1000以内的数,就要申请1001个内存空间,即便我只需要对1000以内中的某6个数进行排序,也得申请1001个空间。
如果在这几个需要排序的数里有小数,哪该怎么办?
这就需要去了解冒泡排序。