【经典算法】N001:得分排行
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:得分排行相关推荐
- 经典算法书籍推荐以及算法书排行【算法四库全书】
经典算法书籍推荐以及算法书排行[算法四库全书] 作者:霞落满天 https://linuxstyle.blog.csdn.net/ https://blog.csdn.net/21aspne ...
- 【经典算法题】多边形三角剖分的最低得分
[经典算法题]多边形三角剖分的最低得分 Leetcode 1039 多边形三角剖分的最低得分 题目描述:Leetcode 1039 多边形三角剖分的最低得分 分析 本题的考点:动态规划. 分析如下: ...
- JAVA经典算法大全
JAVA经典算法大全 from http://java-mans.iteye.com/blog/16457031.河内之塔 2.Algorithm Gossip: 费式数列. 3.巴斯卡三角形 4.A ...
- 【经典算法大全】收集51种经典算法 初学者必备
<经典算法大全>是一款IOS平台的应用.里面收录了51种常用算法,都是一些基础问题.博主觊觎了好久,可悲哀的是博主没有苹果,所以从网上下了老奔的整理版并且每个都手敲了一遍. 虽然网上也有博 ...
- 《异常检测——从经典算法到深度学习》5 Opprentice——异常检测经典算法最终篇
<异常检测--从经典算法到深度学习> 0 概论 1 基于隔离森林的异常检测算法 2 基于LOF的异常检测算法 3 基于One-Class SVM的异常检测算法 4 基于高斯概率密度异常检测 ...
- 经典算法51(来测测你的编程基础)
1.河内之塔.. 2.Algorithm Gossip: 费式数列. 3. 巴斯卡三角形 4.Algorithm Gossip: 三色棋 5.Algorithm Gossip: 老鼠走迷官(一) 6. ...
- java 经典算法(转)
1.河内之塔.. 2.Algorithm Gossip: 费式数列. 3. 巴斯卡三角形 4.Algorithm Gossip: 三色棋 5.Algorithm Gossip: 老鼠走迷官(一) 6. ...
- 数据挖掘十大经典算法(详解)
数据挖掘十大经典算法 一. C4.5 C4.5算法是机器学习算法中的一种分类决策树算法 ...
- 数据挖掘十大经典算法(转存)
一.C4.5 C4.5 算法是机器学习算法中的一种分类决策树算法,其核心算法是 ID3 算法. C4.5 算法继承了 ID3 算法的优点,并在以下几方面对 ID3 算法进行了改进: 1) 用信息增益率 ...
最新文章
- php中文网企业网站,闻名 PHP企业网站系统 weenCompany v5.3.0 简体中文 UTF8
- python 英语词频统计软件_Python数据挖掘——文本分析
- ubuntu学习摘要-ubuntu root用户
- php中cookie存的是什么,PHP中Cookie存在的作用和用法
- Spring AspectJ Execution 表达式
- filepermission java,Java FilePermission getActions()方法与示例
- 算法与数据结构1800题 之 栈和队列
- Rest Framework:二、序列化组件
- JavaScript跨域调用基于JSON的RESTful API
- doc和docx、xls和xlsx、ppt和pptx有什么区别?
- Linux终端命令工具修改语言切换中文
- 基于万维易源提供的API接口实现快递单号查询物流信息
- 用微PE安装KALI LINUX到U盘,【U盘安装kali】U盘 kali pe三合一教程!装机,存储
- Root file specified for compilation Vetur
- [SugerTangYL] 时钟管理(分频器、倍频器、锁相环)Verilog
- Python字符串| min()
- 马斯克被指性骚扰空姐,已支付170万封口费,马一龙:这是他们卑鄙的剧本!...
- SDKMAN 安装过程
- MyBatis自动生成实体类、DAO接口和Mapping映射文件的代码(逆向工程)
- Educational Codeforces Round 140 (Rated for Div. 2)题解
热门文章
- Python暴力破解教程: Zip、pdf加密在线爆破!
- 关于拼多多开店售后服务的话术
- 玩转ChatGPT:制作思维导图
- 苹果cms php获取id,【PHP】苹果cms 8.0天蓝色苹果cms模板 一键采集+会员收费系统
- 艺术签名制作软件有什么?这篇文章来告诉你
- VSCode终端和Windows Terminal中文UTF-8乱码解决方案
- 文件粉碎机 v4.38 官方
- 东大22春《电工电子技术及应用》在线平时作业2百分资料
- 产品经理基础-10运营平台端产品设计(完结~撒花~)
- window10系统pgAdmin4 忘记主管理密码处理