排序算法 —— 计数排序
引言
计数排序是桶排序思想的一种具体实现,针对一些具有特殊限制的样本数据,如公司员工年龄,那么样本数据本身就一定在0~200之间,针对这样的数据,使用从0到200 的桶数组,桶的位置已经是有序的,只需要将对应年龄的数据放入对应的桶,比如,24岁的员工有10人,那么就往 24 号桶中放10个数据。将所有员工年龄数据放入桶数组中后,只需要再次将它们放回到原数组就可以实现排序了:
一、代码实现
public static void countSort(int[] arr) {if (arr == null || arr.length < 2)return;// 找到数组中的最大值int max = Integer.MIN_VALUE;for (int i = 0; i < arr.length; i++) {max = Math.max(max, arr[i]);}// 为了能够覆盖到最后一个值,需要+1int[] buckets = new int[max + 1];// 桶的下标记录数据,桶中的元素记录数据数量for (int i = 0; i < arr.length; i++) {buckets[arr[i]]++;}int i = 0;// 循环桶数组for (int j = 0; j < buckets.length; j++) {// 如果桶中有元素,那么执行放回操作,并递减,直到取出所有元素while (buckets[j]-- > 0) {// 桶下标代表数据本身,因此直接以下标作为返回的数据arr[i++] = j;}}}
二、计数排序的时间复杂度
计数排序是多个循环操作的累加。
首先是遍历数组,求得一个最大值,来决定桶的个数,时间复杂度是O(N);
然后是将所有元素计数到辅助的桶数组中,时间复杂度是O(N);
随后,通过遍历桶数组,选出存有数据的桶,并依次取出累计个数的元素并返回到原数组中,虽然for循环嵌套了while循环,但实际上while只是把桶中的元素全部取出,其for + while操作的次数一定等于元素个数N,因此时间复杂度同样是O(N)。
所以,最后得出计数排序的时间复杂度是 O(N) + O(N) + O(N) = O(3N) 忽略倍数即为 O(N)。
排序算法 —— 计数排序相关推荐
- 三种线性排序算法 计数排序、桶排序与基数排序—— 转自:BYVoid
三种线性排序算法 计数排序.桶排序与基数排序 [非基于比较的排序] 在计算机科学中,排序是一门基础的算法技术,许多算法都要以此作为基础,不同的排序算法有着不同的时间开销和空间开销.排序算法有非常多种, ...
- 排序算法---计数排序(java版)
计数排序 原理 计数排序(Counting Sort) 使用了一个额外的数组 C,其中第 i 个元素是待排序数组A 中值等于 i 的元素的个数.然后根据数组 C 来将 A 中的元素排到正确的位置.其实 ...
- 排序算法——计数排序详解
在排序的最终结果中,各元素的次序依赖于它们之间的比较.这类排序算法被称为比较排序.对于包含 nnn 个元素的输入序列来说,任何比较排序算法在最坏情况下都要经过至少 O(nlogn)O(n\ log\ ...
- 十大排序算法——计数排序
计数排序 一. 计数排序介绍 二. 计数排序基础版 三. 计数排序改进版 四. 优化最终版本_空间节省 一. 计数排序介绍 计数排序(Counting sort)是一种稳定的排序算法.计数排序使用一个 ...
- 【vlfeat】O(n)排序算法——计数排序
今天想在网上找一个实现好的er算法来着,没啥具体的资料,无奈只能看vlfeat的mser源码,看能不能修修补补实现个er. 于是,看到某一段感觉很神奇,于是放下写代码,跑来写博客,也就是这段 1 /* ...
- 三种线性排序算法 计数排序、桶排序与基数排序-BYVoid
转自:BYVoid [非基于比较的排序] 在计算机科学中,排序是一门基础的算法技术,许多算法都要以此作为基础,不同的排序算法有着不同的时间开销和空间开销.排序算法有非常多种,如我们最常用的快速排序和堆 ...
- JavaScript实现十种经典排序算法(js排序算法)
冒泡排序算法 冒泡排序(Bubble Sort)是一种简单直观的排序算法.冒泡排序算法的步骤描述如下: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一 ...
- 十大经典排序算法-桶排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- 十大经典排序算法-选择排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
最新文章
- python input和print,Python基础——输出[print()]与输入[input()]
- Sequelize框架
- Searchsploit
- 05-session-会话跟踪技术
- cfile read 最大读取限制_pandas读取表格后的常用数据处理操作
- selenium模拟登陆时截取验证码
- 用户体验设计答疑对话(半吊子和纯外行
- nginx+php-fpm配置后页面显示空白的解决方法以及用nginx和php-fpm解决“502 Bad Gateway”问题...
- 使用CucumberJS,让JavaScript与行为驱动开发结合
- 实验——示波器法测量相位差(试验记录)
- ubuntu16.04设置自启动wifi热点
- error CS0234: 命名空间“XXX”中不存在类型或命名空间名“MVC”(是否缺少程序集引用?)
- 教师资格证面试缴费找不到服务器,2016年教师资格证考试报名网上缴费常见问题...
- W3school:CSS基础:CSS注释、颜色(颜色、RGB、HEX、HSL)、背景(背景、背景图像、背景重复、背景附着、简写背景属性)
- ESP8266连接阿里云--MQTT协议
- 一台电脑可以登录多个微信的脚本
- Cadence常规通孔焊盘的创建
- Python2.X无换行无空格输出
- CPU架构:CPU架构详细介绍
- c++ const 转非const
热门文章
- ascii非打印控制字符表_C程序打印ASCII表/图表
- SpringBoot时间格式化的5种方法!
- Oracle plsql 打包
- 山东省计算机春季高考大纲,2017年山东春季高考专业知识考试大纲.doc
- Bootstrap 幻灯片效果
- 【NOIP2015提高组】子串 区间DP+滚动数组优化
- java 多线程工具_多线程测试工具groboutils的使用
- vivado顶层模块怎么建_【第2040期】Node 模块化之争:为什么 CommonJS 和 ES Modules 无法相互协调...
- alter table add column多个字段_利用Python将多个excel合并到一个文件中
- java web输出语句到控制台_Java工程师(6).循环结构