【硬核】小明高考考了680分,他想知道在全国1000W考生中排什么名次?
微信搜索 【微观技术】,关注这个不喜欢内卷的程序员。
精彩文章汇总 GitHub https://github.com/aalansehaiyang/technology-talk ,Star 12K ,汇总java生态圈常用技术框架、开源中间件,系统架构、数据库、大公司架构案例、常用三方类库、项目管理、线上问题排查、个人成长、思考等知识
有这么一道题:
今年高考,有1000万的考生参加了考试,满分750,小明靠了680分,他想知道自己的全国排名,如何快速排序呢?
这里面会给大家介绍几种算法:
一、桶排序
算法思想
将要排序的数据拆分、分组放入几个有序
的桶里,然后分别对每一个桶中的元素排序,最后将桶中的元素依次取出,就完成了最终的排序。
例子:
对 9,8,19,2,7,15,20,6,4,1,11,17 等数字排序。(为了简化描述,这里只列举了12个数)
其中,最小值是 1,最大值是 20。整个区间最大跨度是 20,我们将其分成了4个桶,然后再采用
快速排序
对每个桶里的元素排序。
如果待排序的数据是m个,均匀的分到n个桶中,每个桶中的元素个数 j=m/n
每个桶采用快速排序,时间复杂度是 O(j*log(j))
,所有桶的时间复杂度是 O(n*j*log(j))
整理后,该算法的时间复杂度是 O(m*log(m/n))
如果桶个数n无限接近m,那桶排序的时间复杂度近似 O(m)
适用场景
1、数据均匀分布,没有严重倾斜。否则,很容易发生大部分数据集中在某几个桶中
2、桶容易划分,如:手机号排序就不太适合
3、桶与桶之间天然有序,不需要再单独排序
4、一些特殊的场景,比如数据文件很大,有几十个G,内存无法一次全部加载,可以考虑分桶,分批排序
整理了一份大厂常考面试题,这份pdf包括 Java基础、Java并发、JVM、MySQL、Redis、Spring、MyBatis、Kafka、设计模式等面试题,分享给大家。
下载地址:百度云链接:https://pan.baidu.com/s/1XHT4ppXTp430MEMW2D0-Bg 提取码: s3ab
如果桶中的数据分布不均匀怎么办?
一图胜千言,“拆”字万里行,大事化小,小事化了。
我们对原始数据分组选桶时,可以为每个桶设定一个计数器,当发现某个分桶的数据量偏大时,可以考虑将该桶二次拆分为若干子桶。
当然,如果子桶的数据量还是很大,我们可以进一步拆分为子子桶。
拆分的深度,可以结合具体业务情况,自己把控。
如果排序的数据的范围不大(比如人的年龄、考试成绩),采用先分桶再快速排序有些浪费,我们可以采用下面这种排序方式。
二、计数排序
计数排序的要求是排序的数据范围不大,比如有m个数,其中最大值是i,那么可以分成i个桶,每个桶里的数据都是相同的,这样就省掉了对桶内元素的排序。
举个典型的场景:
我们都参加过高考,今年有1000万的考生参加考试,满分750,小明考了680分,他想知道自己的全国排名,如何快速排序呢?
满分750,考生的分数最小可能是0分,最高是750分,所以我们就分为了 751 个桶,按分数将考生放入对应的桶中。
然后,再依次读取每个桶中的数据,写入一个数组中,便得到了 1000万考生的分数排名。
小明考了680分,他想快速知道自己的排名,如何实现?
方案一:遍历排序好的数组,由于是由大到小且有序的,我们找到第一个680的元素,便得到最终的排名。
方案二:对算法进行优化,每个桶配备一个计数器
,桶中每添加一个元素,计数器加一。这样,你只需要将681~750 之间的桶的计数器累计求和,便得到最终的排名。
三、基数排序
上面的两种排序,还是很好理解的,可以解决很多业务场景问题。
但如果是对若干数量的手机号由小到大排序,怎么解决呢?
我们知道,手机号是11位,范围太大,而桶排序和计数排序,对数据范围有较高要求
,显然手机号不太合适。
这里介绍一种新的排序算法,基数排序。
核心思想
先比较高位的值,如果a的高位大于b的高位,那么a肯定是大于b的,后面的低位值就可以不用比较。
比如:对下面的若干英文名做排序
解题思路,如上图所示
首先,对每个名称的第一个字母做排序,可以采用分桶或计数排序。
同一个桶内的元素,然后提取第二个字母,再次分桶或计数排序,
循环遍历,直到比较完第11位,
当然,比较期间,如果某个阶段,桶中的元素只有一个,那么该阶段可以终止。
有点类似上面的《如果桶中的数据分布不均匀怎么办?》解决思路。
特别注意:
上面排序的英文名字长度可能不同,我们先要做数据预处理,取最大的长度,将位数不够的后面补"0"。
因为ASCII 值,最小的是字母A,对应的十进制是65,也是大于0。所以,补“0” 不影响排序。
适用场景
如果整体比较难度较大,数值的区间较大,不适合分桶。我们可以考虑采用分割的思想,分割出若干小段,依次对小段来比较,各个小段存在递进关系。
关于我:Tom哥,前阿里P7技术专家,出过专利,多年大厂实战经验。欢迎关注,我会持续输出更多经典原创文章,为你大厂助力。
欢迎小伙伴找Tom哥唠嗑聊天, 技术交流,围观朋友圈,人生打怪不再寂寞。
【硬核】小明高考考了680分,他想知道在全国1000W考生中排什么名次?相关推荐
- 硬核小鹏又整活了:辅助驾驶干到下半场,飞行汽车请尽快量产
作者 | 德新 编辑 | 王博 1024,是程序员的节日. 但在汽车行业,因为小鹏,这几年1024已经逐渐变成汽车科技的秀场. 小鹏的1024科技日始于2019年. 2020年,智能驾驶XPILOT和 ...
- 全程快捷键!硬核小哥超快配图1700页数学笔记,教你上手LaTeX+Inkscape
边策 乾明 发自 凹非寺 量子位 报道 | 公众号 QbitAI 之前,我们介绍了一位神奇的本科生,他在数学课上用Vim+LaTeX,全程手打出1700页课堂笔记,速度直追老师的板书. 现在,这位G ...
- latex 上标_1700页数学笔记火了!全程敲代码,速度飞快易搜索,硬核小哥教你上手LaTeX+Vim...
晓查 乾明 发自 凹非寺 转自: 量子位 | 公众号 QbitAI 又出现一位"神仙"本科生! 数学课上,全程键盘手打1700页笔记. 速度紧追老师板书,公式.图形一个不落. 效 ...
- 1700 页数学笔记火了!全程敲代码,速度飞快易搜索,硬核小哥教你上手 LaTeX+Vim...
点击"小詹学Python",选择"星标"公众号 重磅干货,第一时间送达 本文转载自量子位,禁二次转载 又出现一位"神仙"本科生! 数学课上, ...
- 硬核小知识,网络管理员的技术职业规划《一》
前言 网管员是目前我们做网络建设网络运营,网络管理包括网络安全整个技术建设当中最重要的一个环节,所以实际上很多人以为网管员将来就是网络管理员及把定位在这样一个角度是不对的. 网管员的职能表达在所在公司 ...
- 硬核,学习 Java 的一点小建议(思维导图,建议收藏)!
CSDN 收到一条读者的私信,情真意切,所以我承诺他今天一定写篇文章好好回复他一下.先来看一下他的私信内容吧. 首先映入我的眼帘的是这个称呼--"老前辈",我一下子没忍住,笑了! ...
- 这个B站up主太硬核了!纯手工打造AI小电视:硬件自己焊接,驱动代码全手写...
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 晓查 发自 凹非寺 本文转自自:量子位(QbitAI) 一个低调的 ...
- 高德地图显示多个气泡_CarPlay分屏功能“硬核”上线 高德地图用户可第一时间尝鲜...
苹果今天正式推送iOS 13.4系统更新,其中分屏功能是这次CarPlay最 "硬核" 的一项改进.此前分屏功能只有苹果自带地图可以实现,本次升级后,高德地图用户也可以第一时间享受 ...
- 小程序多端框架全面测评 | 程序员硬核评测
作者 | 凹凸实验室 责编 | 伍杏玲 [CSDN 编者按]最近前端界多端框架频出,各巨头公司纷纷造出各家的轮子,例如滴滴的Chameleon.美团的Mpvue.京东的Taro.DCloud的uni- ...
最新文章
- Python练习-循环及切片-2018.11.27
- php auth_http,php auth_http类库进行身份效验
- 2021年11月编程语言排行榜出炉
- 微信小程序 小程序源码包括后台完整版分享
- 【自动化__持续集成】___java___XML__DOM4操作
- 【数据结构与算法】图
- 线程1-线程常用方法
- Linux命令解释之setfacl,getfacl,chattr
- Q96:PT(2):纹理的仿射变换(Textures And Transformations)
- 内网穿透工具NatApp使用教程
- nodejs字符串如何转成json数据
- php计算众数,C++算法代码——众数
- 爆款预订,2022 年最值得关注的后台框架 —— Fantastic-admin
- 查看手机的mac地址
- greenplum麒麟安装笔记
- python 猪八戒网接单_python接单平台简单整理
- 残疾人求职阿里巴巴等了八年!好辛苦!
- linux的led驱动的实验总结,linux设备驱动归纳总结(五):4.写个简单的LED驱动
- 【华为OD机试真题 python】羊、狼、农夫过河【2022 Q4 | 100分】
- 一致性hash算法虚拟节点解决方案