1. 【经典算法】 得分排行

1.1 算法描述

如果有一教师依学生座号输入考试分数,现希望在输入完成后自己主动显示学生分数的排行。当然学生的分数可能同样。

1.2 算法解析

1.2.1 基础版本

使用额外的一个排行数组来遍历分数数组即可。方法虽然简单,但是反覆计算的次数是n^2,如果n值变大,那么运算的时间就会拖长。

 public static void printScoreRank01(int[] score) {int count = score.length;int[] order = new int[count + 2];for(int  i = 0; i < count; i++) {order[i] = 1;for(int j = 0; j < count; j++) {if(score[j] > score[i]) {order[i]++;}}}System.out.println("得分\t排行\n");for(int i = 0; i < count; i++) {System.out.println(score[i] + "\t" + order[i]);}}

1.2.2 递进版本

设定排名数组rank的长度为n+2,并将初始值设定为0,如下所示:

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

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

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

 public static void printScoreRank02(int[] score) {int count = score.length;int[] rank = new int[MAX_SCORE + 2];for (int i = 0; i < count; i++) {rank[score[i]]++;}rank[MAX_SCORE + 1] = 1;for (int i = MAX_SCORE; i >= 0; i--) {rank[i] = rank[i] + rank[i + 1];}System.out.println("得分\t排行\n");for (int i = 0; i < count; i++) {System.out.println(score[i] + "\t" + rank[score[i] + 1]);}}

1.3 代码执行

package com.gavinbj.leetcode.classic;/*** 假设有一教师依学生座号输入考试分数,现希望在输入完毕后自动显示学生分数的排行。 注意学生的分数可能相同。* * @author gavinbj**/
public class ScoreRanking {// 以百分之为例,其他的特殊分数在进行调整public static final int MAX_SCORE = 100; public static void main(String[] args) {// 随机创建一批成绩作为输入参数。int[] arr = new int[30];for(int i=0; i<30; i++) {arr[i] = (int)(Math.random()*100);}// 分别调用两种排序进行排序printScoreRank01(arr);printScoreRank02(arr);}/*** 得分排行01: 使用额外的一个排行数组便利分数数组阵列* 计算的次数是n^2, 如果n值变大,那么运算的时间就会超长* * @param score*/public static void printScoreRank01(int[] score) {int count = score.length;int[] order = new int[count + 2];for(int  i = 0; i < count; i++) {order[i] = 1;for(int j = 0; j < count; j++) {if(score[j] > score[i]) {order[i]++;}}}System.out.println("得分\t排行\n");for(int i = 0; i < count; i++) {System.out.println(score[i] + "\t" + order[i]);}}/*** 得分排行02: *      1.遍历分数数组score,获得各分数人数的数组rank*        2.对rank分数数组进行向左相加处理,获得终于分数相应的排名* * @param score*/public static void printScoreRank02(int[] score) {int count = score.length;int[] rank = new int[MAX_SCORE + 2];for (int i = 0; i < count; i++) {rank[score[i]]++;}rank[MAX_SCORE + 1] = 1;for (int i = MAX_SCORE; i >= 0; i--) {rank[i] = rank[i] + rank[i + 1];}System.out.println("得分\t排行\n");for (int i = 0; i < count; i++) {System.out.println(score[i] + "\t" + rank[score[i] + 1]);}}}

执行结果:

得分   排行87    10
94  4
69  14
88  9
97  3
75  12
93  6
21  26
45  18
50  16
98  1
98  1
24  24
0   30
42  20
45  18
75  12
76  11
26  23
51  15
91  7
1   28
1   28
22  25
31  21
46  17
29  22
94  4
4   27
89  8

【经典算法】N001:得分排行相关推荐

  1. 经典算法书籍推荐以及算法书排行【算法四库全书】

    经典算法书籍推荐以及算法书排行[算法四库全书] 作者:霞落满天   https://linuxstyle.blog.csdn.net/    https://blog.csdn.net/21aspne ...

  2. 【经典算法题】多边形三角剖分的最低得分

    [经典算法题]多边形三角剖分的最低得分 Leetcode 1039 多边形三角剖分的最低得分 题目描述:Leetcode 1039 多边形三角剖分的最低得分 分析 本题的考点:动态规划. 分析如下: ...

  3. JAVA经典算法大全

    JAVA经典算法大全 from http://java-mans.iteye.com/blog/16457031.河内之塔 2.Algorithm Gossip: 费式数列. 3.巴斯卡三角形 4.A ...

  4. 【经典算法大全】收集51种经典算法 初学者必备

    <经典算法大全>是一款IOS平台的应用.里面收录了51种常用算法,都是一些基础问题.博主觊觎了好久,可悲哀的是博主没有苹果,所以从网上下了老奔的整理版并且每个都手敲了一遍. 虽然网上也有博 ...

  5. 《异常检测——从经典算法到深度学习》5 Opprentice——异常检测经典算法最终篇

    <异常检测--从经典算法到深度学习> 0 概论 1 基于隔离森林的异常检测算法 2 基于LOF的异常检测算法 3 基于One-Class SVM的异常检测算法 4 基于高斯概率密度异常检测 ...

  6. 经典算法51(来测测你的编程基础)

    1.河内之塔.. 2.Algorithm Gossip: 费式数列. 3. 巴斯卡三角形 4.Algorithm Gossip: 三色棋 5.Algorithm Gossip: 老鼠走迷官(一) 6. ...

  7. java 经典算法(转)

    1.河内之塔.. 2.Algorithm Gossip: 费式数列. 3. 巴斯卡三角形 4.Algorithm Gossip: 三色棋 5.Algorithm Gossip: 老鼠走迷官(一) 6. ...

  8. 数据挖掘十大经典算法(详解)

                                                           数据挖掘十大经典算法  一. C4.5  C4.5算法是机器学习算法中的一种分类决策树算法 ...

  9. 数据挖掘十大经典算法(转存)

    一.C4.5 C4.5 算法是机器学习算法中的一种分类决策树算法,其核心算法是 ID3 算法. C4.5 算法继承了 ID3 算法的优点,并在以下几方面对 ID3 算法进行了改进: 1) 用信息增益率 ...

最新文章

  1. php中文网企业网站,闻名 PHP企业网站系统 weenCompany v5.3.0 简体中文 UTF8
  2. python 英语词频统计软件_Python数据挖掘——文本分析
  3. ubuntu学习摘要-ubuntu root用户
  4. php中cookie存的是什么,PHP中Cookie存在的作用和用法
  5. Spring AspectJ Execution 表达式
  6. filepermission java,Java FilePermission getActions()方法与示例
  7. 算法与数据结构1800题 之 栈和队列
  8. Rest Framework:二、序列化组件
  9. JavaScript跨域调用基于JSON的RESTful API
  10. doc和docx、xls和xlsx、ppt和pptx有什么区别?
  11. Linux终端命令工具修改语言切换中文
  12. 基于万维易源提供的API接口实现快递单号查询物流信息
  13. 用微PE安装KALI LINUX到U盘,【U盘安装kali】U盘 kali pe三合一教程!装机,存储
  14. Root file specified for compilation Vetur
  15. [SugerTangYL] 时钟管理(分频器、倍频器、锁相环)Verilog
  16. Python字符串| min()
  17. 马斯克被指性骚扰空姐,已支付170万封口费,马一龙:这是他们卑鄙的剧本!...
  18. SDKMAN 安装过程
  19. MyBatis自动生成实体类、DAO接口和Mapping映射文件的代码(逆向工程)
  20. Educational Codeforces Round 140 (Rated for Div. 2)题解

热门文章

  1. Python暴力破解教程: Zip、pdf加密在线爆破!
  2. 关于拼多多开店售后服务的话术
  3. 玩转ChatGPT:制作思维导图
  4. 苹果cms php获取id,【PHP】苹果cms 8.0天蓝色苹果cms模板 一键采集+会员收费系统
  5. 艺术签名制作软件有什么?这篇文章来告诉你
  6. VSCode终端和Windows Terminal中文UTF-8乱码解决方案
  7. 文件粉碎机 v4.38 官方
  8. 东大22春《电工电子技术及应用》在线平时作业2百分资料
  9. 产品经理基础-10运营平台端产品设计(完结~撒花~)
  10. window10系统pgAdmin4 忘记主管理密码处理