【算法精解】计数排序

  1. 基本认识:是一个特殊的桶排序。基于比较排序的排序方法,其复杂度无法突破nlogn 的下限,但是非比较排序却可以突破该下限,甚至达到O(n)的时间复杂度。当有n个数据时,所处的范围并不大,最大值是k,那么就划分k个桶。每个桶都存储相同的数据。这样可以省掉桶内排序的时间。
  2. 时间复杂度:因为整个过程只涉及到扫描遍历操作,所以时间复杂度是O(n+k)。【n为元素个数,k为待排序最大值与最小值之差】
  3. 优缺点:适用于待排序数据的范围不大的情况,若范围比较大,会产生很多空桶,造成空间浪费。
  4. 适用场景:以高考为例,假设某省有50万考生,高考成绩满分是750分,我们可以分配751个桶(最低0分,最高750分),遍历50万考生的成绩,划分到751个桶中,最后只需要依次扫描桶,就可以输出排序好的数据。
  5. 排序思路
对A[8]进行排序,其中A[8] = {0,2,3,5,2,3,0,3},min=0,max=5
1、遍历A[8],得到C[6]={2,0,2,3,0,1}。//C[0]=2的含义为:值为0的数据再A[]中有两个
2、对C[6]数组顺序求和,C[k]存储小于等于分数k的考生个数,C[6]={2,2,4,7,7,8}。//C[1]=2的含义为:A[]中 <= 1的值有两个
3、新建一个数据R[8]用于存储排序好的数据。
4、从后向前遍历数据A[8],A[8]的倒数第一个数为3,C[6]下标为3的数为7,表明数组A中小于等于3的有7个人,所以讲这个3放入R[8]的第7个位置,C[6]下标为3位置的数变为7-1=6。此时R[8]={0,0,0,0,0,0,3,0},C[6]={2,2,4,6,7,8}。
5、依次类推,扫描A[8]剩下的数据。最后R[8]就是排序好的数据。
  1. Java代码实现
public class Order {public static void main(String[] args) {int[] beforArr = {13, 19, 15, 11, 7, 11, 25, 21, 29, 17, 15, 14, 17, 29, 28, 22};System.out.println("待排序数据:" + Arrays.toString(beforArr));int[] afterArr = countingSort(beforArr);System.out.println("排序之后数据:" + Arrays.toString(afterArr));}public static int[] countingSort(int[] beforArr){int max = beforArr[0];//记录最大值int min = beforArr[0];//记录最小值for (int arr : beforArr) {//获取最大值if (arr > max){max = arr;}//获取最小值if (arr < min){min = arr;}}//记录容器的大小int size = max - min + 1;//定义桶容器int[] bucket = new int[size];//计算每个元素的个数,放入桶中for (int i=0; i<beforArr.length; i++){//最小值min对应数组索引0,依次类推bucket[beforArr[i]-min] ++;}//依次累加for (int i=1; i < size; i++){bucket[i] = bucket[i] + bucket[i-1];}//存放排序好数据的数组int[] afterArr = new int[beforArr.length];//倒序遍历待排序数据for (int i=beforArr.length-1; i>=0; i--){//获取对应桶下标存储的个数int index = bucket[beforArr[i]-min] - 1;//存入afterArrafterArr[index] = beforArr[i];//对应桶下标存储个数-1bucket[beforArr[i]-min] --;}return afterArr;}
}

▄█▀█●各位同仁,如果我的代码对你有帮助,请给我一个赞吧,为了下次方便找到,也可关注加收藏呀
如果有什么意见或建议,也可留言区讨论

【算法精解】计数排序相关推荐

  1. js排序算法详解-计数排序

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-计数排序 计数排序就是遍历数组记录数组下的元素出现过多次,然后把这个元素找个位置先安置下来,简单点说就是以原数 ...

  2. js排序算法详解-桶排序

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-桶排序 一看到这个名字就会觉得奇特,几个意思,我排序还要再准备几个桶不成?还真别说,想用桶排序还得真准备几个桶 ...

  3. 资料 | O‘Reilly精品图书系列:算法精解 C 语言描述 (简体中文)

    下载地址:资料 | O'Reilly精品图书系列:算法精解 C 语言描述 (简体中文) 内容简介 · · · · · · 本书是数据结构和算法领域的经典之作,十余年来,畅销不衰! 全书共分为三部分:第 ...

  4. JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法)

    转载自   JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法) 引言 何为终极算法? 其实就是现在的JVM采用的算法,并非真正的终极.说不定若干年以后,还会有新的终极算法, ...

  5. JVM内存管理------GC算法精解(五分钟让你彻底明白标记/清除算法)

    转载自  JVM内存管理------GC算法精解(五分钟让你彻底明白标记/清除算法) 相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑 ...

  6. JVM内存管理------GC算法精解(复制算法与标记/整理算法)

    转载自  JVM内存管理------GC算法精解(复制算法与标记/整理算法) 本次LZ和各位分享GC最后两种算法,复制算法以及标记/整理算法.上一章在讲解标记/清除算法时已经提到过,这两种算法都是在此 ...

  7. js排序算法详解-希尔排序

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-希尔排序 希尔排序,直接上图: 像这个算法看图理解起来并不是很难,就像比赛一样,1-6一组,2-7一组,每差5 ...

  8. js排序算法详解-选择排序

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-选择排序 相对于冒泡排序还有一种类似的方法就是选择排序,顾名思义就是选择性排序,什么意思呢? 这么来理解,假设 ...

  9. Hark的数据结构与算法练习之计数排序

    算法说明 计数排序属于线性排序,它的时间复杂度远远大于常用的比较排序.(计数是O(n),而比较排序不会超过O(nlog2nJ)). 其实计数排序大部分很好理解的,唯一理解起来很蛋疼的是为了保证算法稳定 ...

  10. 算法精解 c语言描述 豆瓣,斯坦福大学教授亲授,这本美亚4.7星的算法书,新手程序员都看得懂!...

    原标题:斯坦福大学教授亲授,这本美亚4.7星的算法书,新手程序员都看得懂! "算法会扩展并提高大家的编程技巧,而学习基本的算法设计范式,可以和许多不同领域的不同问题密切相关,还能作为预测算法 ...

最新文章

  1. 记第一次线下AWD感受及复现
  2. js获取浏览器和屏幕宽高等信息(转)
  3. Enterprise Library v5.0 -- Data Access Application Block 开发向导(3)
  4. linux如何重启syslog服务,Linux syslog服务
  5. jersey创建restful服务及调用_Jersey实现Restful服务(实例讲解)
  6. 传统企业数字化营销转型必经之路
  7. Android基础入门
  8. 求原谅---好久没更新了
  9. DHCP动态获取IP地址流程
  10. Hexo博客使用LeanCloud统计页面访问次数
  11. 【华人学者风采】程学旗 中国科学院
  12. EM4001射频模块读卡
  13. Android自定义键盘(KeyboardView)
  14. pytorch用多层感知机实现鸢尾花3分类(亲测可用)
  15. 北航软件能力培养启发和下一步工作
  16. 纸短情长 寄语青春 2021 我们毕业了!
  17. 那些 Cynthia 教我的事 之 PMSec (三)
  18. addRoutes的基本使用
  19. 尝试实现MySQL的登录与部署并记录下来_下列说法正确的是
  20. winscp 同步_winscp以命令行方式同步服务器数据到PC机磁盘上

热门文章

  1. matlab pn码捕获,基于PMF_FFT的PN码捕获方法及性能
  2. matlab演化博弈仿真
  3. 图形学基础--深入浅出的微积分书籍 《普林斯顿微积分读本》和《托马斯微积分》
  4. UniWebView笔记
  5. 易语言-VB keypress事件中键盘上每个键的KeyAscii值
  6. Charles使用教程(Mac)
  7. Latex:字体设置
  8. 2022 百度之星程序设计大赛复赛 D.子序列2(动态dp/线段树维护矩阵)
  9. mysql coreseek_关于mysql中文全文检索Sphinx之coreseek
  10. PLSQL注册码(永久可用)