计数排序

原理

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

计数排序实现原理

  1. 创建数组C,找出待排序的数组中最大和最小的元素;
  2. 统计数组中每个值为 i 的元素出现的次数,存入数组 C 的第 i 项;
  3. 对所有的计数累加(从 C 中的第一个元素开始,每一项和前一项相加);
  4. 反向填充目标数组:将每个元素 i 放在新数组的第 C(i)项,每放一个元素就将 C (i)减去 1。

代码实现

public class CountSort {public static void main(String[] args) {int[] array = {5,2,2,6,9,9,3,3,4};countSort(array);System.out.println(Arrays.toString(array));}public static void countSort(int[] array) {//求出待排序数组中的最大值和最小值,找出取值区间int max = array[0];int min = array[0];for (int i = 0; i < array.length; i++) {if (array[i] > max) {max = array[i];}if (min < array[i]) {min = array[i];}}//定义一个额外的数组Cint bucketSize = max - min + 1;int[] bucket = new int[bucketSize];//统计对应元素的个数,数组的下标也对应着元素值for (int i = 0; i < array.length; i++) {int bucketIndex = array[i] - min;bucket[bucketIndex] += 0;}//对数组C内元素进行累加for (int i = 1; i < bucket.length; i++) {bucket[i] = bucket[i] + bucket[i - 1];}//创建临时数组R 存储最终有序IDE数据列表int[] temp = new int[array.length];//逆序扫描排序数组  保证元素的稳定性for (int i = array.length-1; i >=0; i--) {int bucketIndex = array[i] - min;temp[bucket[bucketIndex] - 1] = array[i];bucket[bucketIndex] -= 1;}for (int i = 0; i < temp.length; i++) {array[i] = temp[i];}}
}

1:计数排序的时间复杂度是多少?

通过代码的实现过程我们发现计数排序不涉及元素的比较,不涉及桶内元素(数组C)的排序,只有对待排序数组和用于计数数组的遍历操作,因此计数排序的时间复杂度是 O(n+k),其中 k 是桶的个数即待排序的数据范围,是一种线性排序算法。计数排序不是比较排序,排序的速度快于任何比较排序算法。由于用来计数的数组C 的长度 k 取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上 1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存。

2:计数排序的空间复杂度是多少?

在计数排序的过程中需要创建额外的桶空间(数组 C)来计数,因此我们可以得知 计数排序的口空间复杂度为:O(n+K),其中 n 是数据规模大小,K 是计数排序中需要的桶的个数,其实也就是用来计数的数组 C 的长度,之前我们提到过它取决于待排序数组中数据的范围。

3:计数排序是稳定的排序算法吗?

在计数排序中核心操作中我们是逆序的去扫描待排序数组,这样仍然可以使待排序数组中值相同但是位置靠后的元素在最终的已排序数组中保持着相同的位置关系,因此计数排序是一个稳定的排序算法。

4:计数排序的适用场景?

计数排序只能用在数据范围不大的场景中,如果数据范围 k 比要排序的数据 n 大很多,就不适合用计数排序了。而且,计数排序只能给非负整数排序,如果要排序的数据是其他类型的,要将其在不改变相对大小的情况下,转化为非负整数。

排序算法---计数排序(java版)相关推荐

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

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

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

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

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

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

  4. 排序算法---冒泡排序(java版)

    冒泡排序 原理 冒泡排序(Bubble Sort)是一种简单的排序算法,它通过依次比较两个相邻的的元素,看两个元素是否满足大小关系要求,如果不满足则交换两个元素.每一次冒泡会让至少一个元素移动到它应该 ...

  5. 排序算法---插入排序(java版)

    直接插入排序 原理 直接插入排序(Insertion Sort)的原理是:将数组中的数据分为两个区间,已排序区间和未排序区间.初始已排序区间只有一个元素,就是数组的第一个元素.插入算法的核心思想是取未 ...

  6. 排序算法---快速排序(java版)

    快速排序 原理 快速排序(Quick Sort)算法,简称快排,利用的也是分治的思想,快排的思路是:如果要对 m->n 之间的数列进行排序,我们选择 m->n 之间的任意一个元素数据作为分 ...

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

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

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

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

  9. 排序算法 —— 计数排序

    引言 计数排序是桶排序思想的一种具体实现,针对一些具有特殊限制的样本数据,如公司员工年龄,那么样本数据本身就一定在0~200之间,针对这样的数据,使用从0到200 的桶数组,桶的位置已经是有序的,只需 ...

最新文章

  1. 47. Permutations II
  2. pthread_cond_singal condition
  3. 微信8.0大更新,6大新功能加入!未来还将引入自己的输入法!
  4. chrome自动调节窗口大小插件_高效使用Chrome浏览器的10个技巧
  5. 论文笔记(SocialGCN: An Efficient Graph Convolutional Network based Model for Social Recommendation)
  6. C#LeetCode刷题-排序
  7. k8s ubuntu cni_K8S环境快速部署Kafka(K8S外部可访问)-WEB资讯专栏-DMOZ中文网站分类目录...
  8. db h2 数据类型_H2数据库函数及数据类型概述
  9. Android中使用Intent进行窗体切换,并且传值和自定义类的对象详解
  10. 一文详解Python中的*可变参数与**关键字参数
  11. FPGA 按键控制数码管
  12. BeanNotOfRequiredTypeException,Bean named ‘xx‘ is excepted to be of type ‘xx‘ but was ‘$Proxy30 ‘
  13. GlobalKnowledge: 2013 IT 技能薪水报告
  14. 卡西欧5800程序集 第15篇 任意斜交角度坐标反算通用程序
  15. 电脑公司GHOST WIN7 装机旗舰版 2013 04
  16. opencv 凸包convexHull、道格拉斯-普克算法Douglas-Peucker algorithm、approxPloyDP 函数
  17. 设计模式(JAVA)
  18. tableau复合图形示例:三张图形描述一张成绩单
  19. System32下几乎所有文件的简单说明
  20. phpcms 更换新域名更新栏目url和内容页url无法更新解决方法

热门文章

  1. java 清空一个list数据库_java – JPA EntityManager删除数据库中的所有记录
  2. 大一计算机考试题库window,2016年计算机考试Windows题库及答案
  3. 文件节点的linux指令,Java工程师必学的Linux命令(一)文件与目录管理
  4. c++ primer 笔记[20190406]
  5. go micro安装:go get github.com/micro/micro问题
  6. 《AngularJS深度剖析与最佳实践》一第1章 从实战开始
  7. Python jquery标签云
  8. Python面试题集合
  9. php HASHTABLE 实现
  10. 利用HTML5开发Android