引言

计数排序是桶排序思想的一种具体实现,针对一些具有特殊限制的样本数据,如公司员工年龄,那么样本数据本身就一定在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)。

排序算法 —— 计数排序相关推荐

  1. 三种线性排序算法 计数排序、桶排序与基数排序—— 转自:BYVoid

    三种线性排序算法 计数排序.桶排序与基数排序 [非基于比较的排序] 在计算机科学中,排序是一门基础的算法技术,许多算法都要以此作为基础,不同的排序算法有着不同的时间开销和空间开销.排序算法有非常多种, ...

  2. 排序算法---计数排序(java版)

    计数排序 原理 计数排序(Counting Sort) 使用了一个额外的数组 C,其中第 i 个元素是待排序数组A 中值等于 i 的元素的个数.然后根据数组 C 来将 A 中的元素排到正确的位置.其实 ...

  3. 排序算法——计数排序详解

    在排序的最终结果中,各元素的次序依赖于它们之间的比较.这类排序算法被称为比较排序.对于包含 nnn 个元素的输入序列来说,任何比较排序算法在最坏情况下都要经过至少 O(nlogn)O(n\ log\ ...

  4. 十大排序算法——计数排序

    计数排序 一. 计数排序介绍 二. 计数排序基础版 三. 计数排序改进版 四. 优化最终版本_空间节省 一. 计数排序介绍 计数排序(Counting sort)是一种稳定的排序算法.计数排序使用一个 ...

  5. 【vlfeat】O(n)排序算法——计数排序

    今天想在网上找一个实现好的er算法来着,没啥具体的资料,无奈只能看vlfeat的mser源码,看能不能修修补补实现个er. 于是,看到某一段感觉很神奇,于是放下写代码,跑来写博客,也就是这段 1 /* ...

  6. 三种线性排序算法 计数排序、桶排序与基数排序-BYVoid

    转自:BYVoid [非基于比较的排序] 在计算机科学中,排序是一门基础的算法技术,许多算法都要以此作为基础,不同的排序算法有着不同的时间开销和空间开销.排序算法有非常多种,如我们最常用的快速排序和堆 ...

  7. JavaScript实现十种经典排序算法(js排序算法)

    冒泡排序算法 冒泡排序(Bubble Sort)是一种简单直观的排序算法.冒泡排序算法的步骤描述如下: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一 ...

  8. 十大经典排序算法-桶排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  9. 十大经典排序算法-选择排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

最新文章

  1. python input和print,Python基础——输出[print()]与输入[input()]
  2. Sequelize框架
  3. Searchsploit
  4. 05-session-会话跟踪技术
  5. cfile read 最大读取限制_pandas读取表格后的常用数据处理操作
  6. selenium模拟登陆时截取验证码
  7. 用户体验设计答疑对话(半吊子和纯外行
  8. nginx+php-fpm配置后页面显示空白的解决方法以及用nginx和php-fpm解决“502 Bad Gateway”问题...
  9. 使用CucumberJS,让JavaScript与行为驱动开发结合
  10. 实验——示波器法测量相位差(试验记录)
  11. ubuntu16.04设置自启动wifi热点
  12. error CS0234: 命名空间“XXX”中不存在类型或命名空间名“MVC”(是否缺少程序集引用?)
  13. 教师资格证面试缴费找不到服务器,2016年教师资格证考试报名网上缴费常见问题...
  14. W3school:CSS基础:CSS注释、颜色(颜色、RGB、HEX、HSL)、背景(背景、背景图像、背景重复、背景附着、简写背景属性)
  15. ESP8266连接阿里云--MQTT协议
  16. 一台电脑可以登录多个微信的脚本
  17. Cadence常规通孔焊盘的创建
  18. Python2.X无换行无空格输出
  19. CPU架构:CPU架构详细介绍
  20. c++ const 转非const

热门文章

  1. ascii非打印控制字符表_C程序打印ASCII表/图表
  2. SpringBoot时间格式化的5种方法!
  3. Oracle plsql 打包
  4. 山东省计算机春季高考大纲,2017年山东春季高考专业知识考试大纲.doc
  5. Bootstrap 幻灯片效果
  6. 【NOIP2015提高组】子串 区间DP+滚动数组优化
  7. java 多线程工具_多线程测试工具groboutils的使用
  8. vivado顶层模块怎么建_【第2040期】Node 模块化之争:为什么 CommonJS 和 ES Modules 无法相互协调...
  9. alter table add column多个字段_利用Python将多个excel合并到一个文件中
  10. java web输出语句到控制台_Java工程师(6).循环结构