C实现 得分排行 算法

问题引入

        假设有一教师依学生座号输入考试分数,现希望在输入完毕后自动显示学生分数的排行,

学生的分数可能相同。

问题分析

        若解决这个问题,只需要额外再定义一个排行数组与分数数组相互访问即可。例如以下程序:

        for(int i=0;i<count;i++){

                juni[i]=1;

                for(int j=0;j<count;j++){

                        if(score[j]>score[i]){

                                juni[i]++;

                        }

                }

        }

        printf("得分排行\n");

        for(int i=0;i<count;i++){

                printf("%d\t%d\n",score[i],juni[i]);

        }

        上面方法虽简单,但是反复计算的次数是n²,如果n值变大,那么运算的时间就会拖长。

        改变juni数组的长度为n+2,并将初始值设定为0,如下所示:

        接下来访问分数数组,并在分数所对应的排行数组索引元素上加1,如下所示:

        将排行数组最右边的元素设定为1,然后依次将右边的元素值加至左边一个元素,最后排行数组中的分数+1就是得该分数的排行,如下所示:

 

        这样的方式看起来复杂,其实不过在计算某分数之前排行的人数,假设89分之前的排行人数为x 人,则89分自然就是x+1了,这也是为什么排行阵列最右边要设定为1的原因;如果89分有y人, 则88分自然就是x+y+1,整个阵列右边元素向左加的原因正是如此。

        如果分数有负分的情况,加上一个 偏移值,将所有的分数先往右偏移一个范围,最后显示的时候再减回偏移值。

代码实现

#include <stdio.h>
#include <stdlib.h>
#define MAX 100
#define MIN 0

int main(){
	int score[MAX+1] = {0}; 
	int juni[MAX+2] = {0}; 
	int count = 0, i;
	
	do{
		printf("输入分数,-1结束:"); 
		scanf("%d", &score[count++]);
	}while(score[count-1] != -1); 
	count--;
	for(i = 0; i < count; i++){
		juni[score[i]]++;
	} 
	juni[MAX+1] = 1;
	for(i = MAX; i >= MIN; i--){
		juni[i] = juni[i] + juni[i+1]; 
	}
	printf("得分\t排行\n");
	for(i = 0; i < count; i++){
		printf("%d\t%d\n", score[i], juni[score[i]+1]);
	}
	return 0;
}

运行结果

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等日出看彩虹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值