桶排序 — 计数排序和基数排序

计数排序
int类型数组,其中存的是员工的年龄。比如说16 - 150。对于这样的数据来讲,数据状况是受限的。此时如果将数组从小到大进行排序,该如果实现?
这个实现很简单,实现一个统计数组范围从 0 ~ 150,遍历原数组几岁就在统计数组对应的下标出的值 + 1,遍历完后,再遍历一次统计数组,看统计数组哪些下标对应的值不为0,有几说明对应的年龄就有几个人,写回到老数组即可完成排序。整体时间复杂度O(N)。

public void countSort(int[] arr) {int max = Integer.MIN_VALUE;//选出最大值for (int i = 0; i < arr.length; i++) {Math.max(max, arr[i]);}//数组长度取年龄最大值 + 1int[] count = new int[max + 1];for (int j = 0; j < arr.length; j++) {count[arr[j]]++;}int i = 0;for (int k = 0; k < count.length; k++) {while (count[k]-- > 0) {arr[i++] = k;}}}

这种排序称为计数排序,计数排序所用的思想是桶排序的思想,桶就是容器的意思,题中的年龄就是桶。

这样来看,从排序特征上来分大致可分为两类:不基于比较的排序和比较排序。其中桶排序就是不基于比较的一个。
计数排序不是基于比较,根据年龄,放入不同的桶中,最后从桶中获取,一个比较行为都没有。
不基于比较的排序,一定是数据范围比较特殊。所以,不基于比较的排序的扩展性相较于基于比较的排序来讲,可扩展性比较小,因为基于比较的排序实现了一个对数器之后,所有的基于比较的排序都可以用,而不基于比较的不可以。需要根据具体的样本特征来具体的分析。

基数排序
基数排序对数据范围的约束大概在非负的,用十进制表示的数(负的找到最小值,数组整体加成正数也行)。
假设int[] {103,13,27,25,17,9}。
先将数组中最大值103找出来,算出十进制的位数(几次能将10除完),得出是3。
将其余元素不满3位的高位补0,补充之后是{103,013,027,025,017,009}。
准备0 ~ 9一共10个桶,数组从左往右,根据个位数放进对应下标的桶中。
在这里插入图片描述
放入后,从0桶开始,依次倒出并清空桶(根据个位数排序)。
在这里插入图片描述
根据十位数大小,再次放入桶中。
在这里插入图片描述
再次倒出桶中元素,并清空桶。
在这里插入图片描述
第三次,将百位数放入桶中后再次倒出。
在这里插入图片描述
倒出后,数组有序{009,013,017,025,027,103}
代码实现:
代码中,没有使用队列的方式来创建桶,而是用了另一种方式。

 public static void RadixSort(int[] arr) {if (arr == null || arr.length < 2) {return;}radixSort(arr, 0, arr.length - 1, maxbits(arr));}// L。。。R进行排序public static void radixSort(int[] arr, int L, int R, int digit) {final int radix = 10;int i = 0, j = 0;// 有多少个数准备多少个辅助空间int[] help = new int[R - L + 1];for (int l = 1; l < digit; l++) {int[] count = new int[radix];for (i = L; i <= R; i++) {j = getDigit(arr[i], l);//统计,数组中每个数按照个位十位等拆开后,0~9范围上每一个数共出现了几次count[j]++;}//求出所有数的前缀和for (i = 1; i < radix; i++) {count[i] = count[i] + count[i - 1];}//从尾向前遍历for (i = R; i >= L; i--) {//再次获取当前数,并算出个位数等。。j = getDigit(arr[i], l);//count[j] - 1 确定出当前数应该落在数组位置的下标。//比如 当前j = 2,则说明前缀和count数组中, <= 2 的时 0 ~ 1 范围,// 并且我还是arr从后向前遍历arr,所以arr的位置就应该在count[j] - 1上。help[count[j] - 1] = arr[i];//对应位置数量 - 1count[j]--;}}}public static int maxbits(int[] arr) {int max = Integer.MIN_VALUE;//找到数组中最大值for (int i = 0; i < arr.length; i++) {Math.max(max, arr[i]);}int res = 0;//根据最大值/10,找到十进制位数while (max != 0) {res++;max /= 10;}return res;}//d = 1,2,3 求出x的个位十位百位public static int getDigit(int x, int d) {return ((x / ((int) Math.pow(10, d - 1))) % 10);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/254668.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

816墨盒计算机无法与,816墨盒怎么加墨 816墨盒加墨方法及注意问题【详解】

导语&#xff1a;随着时代的快速发展&#xff0c;人们生活水平的不断提高&#xff0c;打印机在我们日常生活中的应用也变得非常广泛&#xff0c;利用打印机打印文件&#xff0c;还有一些重要的材料&#xff0c;方便了人们的生活&#xff0c;给人们的生活提供了很大的便利&#…

打印机 检测到用过的耗材或者赝品耗材

检测到用过的耗材或者赝品耗材 大家好&#xff0c;今天续着给大家分享下惠普的803/805墨盒加墨应该注意的事项&#xff0c;先预习&#xff0c;加墨就没那么多困惑了~ 加墨后打印白线条、溅墨怎么办&#xff1f; ①先用温水浸泡打印头约30秒&#xff08;注意不要泡到芯片&…

打印机墨盒问题

因为打印机墨盒属于耗材&#xff0c;容易损坏&#xff0c;从而造成打印机没法打印。对于家用打印机来说&#xff0c;一个打印机也就三四百块钱&#xff0c;然后换一个新墨盒就得花掉一百左右&#xff0c;心里感觉贼不爽&#xff0c;墨盒那么小一个&#xff0c;居然要那么贵&…

墨盒 连供漏墨恒压问题

你提出了一个连供压力平衡原理的问题。 连供形状各式各样&#xff0c;但基本原理都是相同的。 以红色为例&#xff1a; 如上图。打印机静止时&#xff0c;墨水室的墨水重力&#xff0c;等于墨水室上方因为空气变稀薄后产生的负压。墨水不会流动。实现了压力的静平衡。 打印机工…

【Java 并发编程】深入理解 AQS - AbstractQueuedSynchronizer

深入理解 AQS - AbstractQueuedSynchronizer 1. AQS1.1 什么是 AQS1.2 AQS 具备的特性 2. AQS 原理解析2.1 AQS 原理概述2.1.1 什么是 CLH 锁2.1.2 AQS 中的队列 2.2 AQS 共享资源的方式&#xff1a;独占式和共享式2.2.1 Exclusive&#xff08;独占式&#xff09;2.2.2 Share&a…

JVM学习笔记(中)

1、垃圾回收算法 标记清除法 特点&#xff1a; 速度较快会产生内存碎片 注意&#xff1a;这里的清除并不是真正意义上的清除&#xff0c;即每个字节都清0&#xff0c;而是记录一下被清除的对象的起始和结束的地址&#xff0c;当下一次分配给一个新对象时&#xff0c;新对象…

《Java并发编程实战》课程笔记(四)

互斥锁 原子性问题到底该如何解决呢&#xff1f; “同一时刻只有一个线程执行”这个条件非常重要&#xff0c;我们称之为互斥。如果我们能够保证对共享变量的修改是互斥的&#xff0c;那么&#xff0c;无论是单核 CPU 还是多核 CPU&#xff0c;就都能保证原子性了。 锁模型 …

RK3588平台开发系列讲解(驱动基础篇)设备树常用 of 函数

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、查找节点的 of 函数二、获取属性值的 of 函数三、实验示例3.1、查找的节点代码3.2、获取属性内容代码沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 设备树描述了设备的详细信息,这些信息包括数字类型的…

chatgpt赋能python:Python中-1的用法介绍

Python中-1的用法介绍 什么是-1&#xff1f; 在Python中&#xff0c;-1是一个特殊的索引值&#xff0c;它表示从序列的末尾开始向前数1个元素。这在对于列表、字符串、元组等序列类型进行操作时非常有用。 如何使用-1&#xff1f; 假设我们有一个列表&#xff1a; l [1, …

SpringBoot框架理解

1 SpringBoot入门 1.2 什么是SpringBoot 1 官网的解释 ​ Spring在官方首页是这么说的&#xff1a;说使用SpringBoot可以构造任何东西&#xff0c;SpringBoot是构造所有基于Spring的应用程序的起点,SpringBoot在于通过最少的配置为你启动程序。 2 我的理解 SpringBoot是Sp…

Flask-RESTful的使用

Flask-RESTful的使用 Flask-RESTful基本使用安装定义资源Resources创建API实例添加资源到API运行Flask应用 请求处理请求解析参数校验 响应处理数据序列化定制返回格式 其他功能蓝图装饰器集合路由命名规范路由名称 Flask-RESTful Flask-RESTful是一个用于构建RESTful API的扩展…

计算机对社会的应用是什么,电子计算对人类社会有什么贡献?应用的领域又有哪些?...

在人类历史上&#xff0c;蒸汽机的发明和电力的使用&#xff0c;曾经在生产技术上引起过划时代的工业革命&#xff0c;然而&#xff0c;这种革命&#xff0c;从本质上来讲&#xff0c;它仅仅是涉及到代替人的体力劳动&#xff0c;但电子计算机的发明&#xff0c;已经涉及到代替…

一位美女博士的人脸识别历程

2019-01-28 16:44:37 1月21日&#xff0c;科技评论期刊《麻省理工科技评论》发布了2018年“35岁以下科技创新35人”&#xff08;35 Innovators Under 35&#xff09;中国榜单。商汤科技研究总监、年仅29岁的石建萍博士荣登此榜&#xff0c;凭借在计算机视觉原创技术的卓越创新…

Android仿微信发图片的样式,做IM的同学的病有救了

一&#xff1a;前言 最近在搞IM&#xff0c;真的特别痛苦。脑袋大&#xff0c;对于我这种菜鸟来说太难了&#xff0c;比现在社会娶个媳妇还难&#xff0c;硬着头皮搞&#xff0c;终于文字&#xff0c;语音&#xff0c;表情搞完了&#xff0c;开始搞图片&#xff0c;看着微信发…

软件压力测试图片60张,看图测压力,你抗压么?

你压力大么&#xff1f;快跟K线君一起来测测&#xff01; 平行线 下图里的横线都是平行的 涉世越深的人&#xff0c;受社会侵蚀越严重 看到的直线越变形 你还是单纯的你吗&#xff1f; 你能看出几条笔直的横线&#xff1f; 我想静静 这是一张静止的图片 你的心理压力越大&#…

网络安全入门学习:社会工程学

在电影《我是谁&#xff1a;没有绝对安全的系统》中&#xff0c;主角本杰明充分利用自己高超的黑客技术&#xff0c;非法入侵国际安全系统&#xff0c;并在最后逃之夭夭。在电影中&#xff0c;有一句经典的台词&#xff1a; 所有黑客手段中最有效的、最伟大的幻想艺术——社会…

《计算机组成原理》唐朔飞 第5章 输入输出系统 - 学习笔记

写在前面的话&#xff1a;此系列文章为笔者学习计算机组成原理时的个人笔记&#xff0c;分享出来与大家学习交流。使用教材为唐朔飞第3版&#xff0c;笔记目录大体与教材相同。 网课 计算机组成原理&#xff08;哈工大刘宏伟&#xff09;135讲&#xff08;全&#xff09;高清_…

easyui 表单提交与图片上传,图片添加、删除

提交表单和图片是web中经常要用到的。我这里用easyui做了一个表单&#xff0c;里面可以上传多张图片&#xff0c;并且可以进行新增和删除。 前端代码如下&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> …

社会化媒体营销方案简介

最近公司经营走到了死胡同里面&#xff0c;就开始研究运营的营销方案&#xff0c;发现有很多的IT公司都在走社会化营销&#xff0c;感觉这会是以后每个公司都会用到的一种营销策略&#xff01;社会化媒体营销-亦称社会化营销&#xff0c;是利用社会化网络&#xff0c;在线社区&…

神经网络提取图片特征,神经网络算法识别图像

如何用Python和深度神经网络寻找相似图像 代码首先&#xff0c;读入TuriCreate软件包import turicreate as tc我们指定图像所在的文件夹image&#xff0c;让TuriCreate读取所有的图像文件&#xff0c;并且存储到data数据框data tc.image_analysis.load_images(./image/)我们来…