学生成绩排序
//题目是判断 5名学生的成绩,最高是10分,从小到大的顺序排列
#include<stdio.h>
#include<windows.h>
int main(void){
system("cls");
int i,j,test,a[11];
for(i=0; i<=10; i++){
a[i] = 0; //分别把他们都初始化为0,表示还没有一个空间有学生成绩
}
for(i=1; i<=5; i++){
printf("请输入第%d个学生第成绩: ", i);
scanf("%d", &test);
a[test]++;
}
for(i=0; i<=10; i++)//判断a[0] ~ a[10]
for(j=1; j<=a[i]; j++){
printf("%d ", i); //分数多少,打印多少
}
printf(" ");
system("pause");
return 0;
}
/*这个程序采用的是对号入座,比如, 第一个同学是5分,为就在a[5]哪里加一次。
而 a[test]++ 也是我最搞不懂地方, 我个人认为是:
假如第一个同学输入第成绩是5, 那么我加从0开始数,到5的时候 == a[4]程序加一次加变成 == a[5],
而书上说的是在,a[5]加一次,如果重复在加一次。
还有一点就是: for(j=1; j<=a[i]; j++) 这里我不懂,为什么我把j=1改成j=0会做不到理想的程序输出。
而 for(j=1; j<=a[i]; j++) 前一条语句 for(i=0; i<=10; i++) 的这个作用,我的理解为是:索引。
索引a[i] 从0~10的
*/
这个程序用了一个非常规的方法来排序,排序效率是高的,占空间也是大的,但输出效率不高.
其中的
a[test]++
不是你理解的,它缺省设
a[0]~a[10]为0
然后同学成绩是多少,相对应就的数组就加1
也就是若成绩test=5,那么
a[test]++就为a[5]++也就是
a[5]=a[5]+1,若是第一个成绩为5的,那么a[5]=0+1=1
这个程序的一个问题是,成绩必须在0~10之间,否则,下标就溢出了
而输出时,用了二重循环,且j从1开始,也就是不会输出a[n]为0的
若a[n]为2,那么就输出两次i
实际应用中,这个方法只用于统计,不太用于排序的
上一篇:青少年志愿者培训内容有哪些