算法说明

计数排序属于线性排序,它的时间复杂度远远大于常用的比较排序。(计数是O(n),而比较排序不会超过O(nlog2nJ))。

其实计数排序大部分很好理解的,唯一理解起来很蛋疼的是为了保证算法稳定性而做的数据累加,大家听我说说就知道了:

1、首先,先取出要排序数组的最大值,假如我们的数组是int[] arrayData = { 2, 4, 1, 5, 6, 7, 4, 65, 42 };,那么最大值就是65.(代码17-21行就是在查找最大值)

2、然后创建一个计数数组,计数数组的长度就是我们的待排序数组长度+1。即65+1=66。计数数组的作用就是用来存储待排序数组中,数字出现的频次。 例如,4出现了两次,那么计数数组arrayCount[4]=2。 OK,现在应该明白为什么计数数组长度为什么是66而不是65了吧? 因为为了存储0

然后再创建一个存储返回结果的数组,数组长度与我们的原始数据长度是相同的。(24和26行)

3、进行计数(代码29至31行)

4、将计数数组进行数量累计,即arrayCount[i]+=arrayCount[i-1](代码35行至代码37行)。 

   目的是为了数据的稳定性, 这块我其实看了许久才看懂的…再次证明我的资质真的很差劲。 我来尽力解释一下:

其实这个与后边那步结合着看理解起来应该更容易些。

例如我们计数数组分别是 1 2 1 2 1 的话,那么就代表0出现了一次,1出现了两次,2出现了一次,3出现了两次。

  这个是很容易理解的。 那我们再换个角度来看这个问题。

  我们可以根据这个计数数组得到每个数字出现的索引位置,即数字0出现的位置是索引0,数字1出现的问题是索引1,2;数字2出现的位置是索引3,数字4出现的位置是索引4,5。。。。

  OK,大家可以看到,这个索引位置是累加的,所以我们需要arrayCount[i]+=arrayCount[i-1]来存储每个数字的索引最大值。 这样为了后边的输出

5、最后,把原始数据从后往前输出;然后每个数字都能找到计数器的最后实现索引。  然后将数字存储在实际索引的结果数组中。 然后计数数组的索引--, 结果就出来了。

PS:计数排序其实是特别吃内存的,所以应用场景是最大值确定并且不大,必须是正整数。

时间复杂度:

O(n+k)

请对照下方代码:因为有n的循环,也有k的循环,所以时间复杂度是n+k

空间复杂度:

O(n+k)

请对照下方代码:需要一个k+1长度的计数数组,需要一个n长度的结果数组,所以空间复杂度是n+k

代码

使用的是java

/** 计数排序*/
public class CountingSort {public static void main(String[] args) {int[] arrayData = { 2, 3, 1, 5, 6, 7, 4, 65, 42 };int[] arrayResult = CountintSort(arrayData);for (int integer : arrayResult) {System.out.print(integer);System.out.print(" ");}}public static int[] CountintSort(int[] arrayData) {int maxNum = 0;// 取出最大值for (int i : arrayData) {if (i > maxNum) {maxNum = i;}}// 计数数组int[] arrayCount = new int[maxNum + 1];// 结构数组int[] arrayResult = new int[arrayData.length];// 开始计数for (int i : arrayData) {arrayCount[i]++;}// 对于计数数组进行 i=i+(i-1)// 目的是为了保证数据的稳定性for (int i = 1; i < arrayCount.length; i++) {arrayCount[i] = arrayCount[i] + arrayCount[i - 1];}for (int i = arrayData.length - 1; i >= 0; i--) {arrayResult[arrayCount[arrayData[i]] - 1] = arrayData[i];arrayCount[arrayData[i]]--;}return arrayResult;}
}

结果

1 2 3 4 5 6 7 42 65

参考:

http://blog.csdn.net/sjin_1314/article/details/8655061

http://www.cnblogs.com/eaglet/archive/2010/09/16/1828016.html

转载于:https://www.cnblogs.com/hark0623/p/4349350.html

Hark的数据结构与算法练习之计数排序相关推荐

  1. Hark的数据结构与算法练习之锦标赛排序

    算法说明 锦标赛排序是选择排序的一种. 实际上堆排序是锦标赛排序的优化版本,它们时间复杂度都是O(nlog2n),不同之处是堆排序的空间复杂度(O(1))远远低于锦标赛的空间复杂度(O(2n-1)) ...

  2. Hark的数据结构与算法练习之圈排序

    算法说明 圈排序是选择排序的一种.其实感觉和快排有一点点像,但根本不同之处就是丫的移动的是当前数字,而不像快排一样移动的是其它数字.根据比较移动到不需要移动时,就代表一圈结束.最终要进行n-1圈的比较 ...

  3. Hark的数据结构与算法练习之珠排序

    ---恢复内容开始--- 算法说明 珠排序是分布排序的一种. 说实在的,这个排序看起来特别的巧妙,同时也特别好理解,不过不太容易写成代码,哈哈. 这里其实分析的特别好了,我就不画蛇添足啦.  大家看一 ...

  4. Hark的数据结构与算法练习之图书馆排序

    算法说明 图书馆排序是插入排序的变种,典型的以空间换时间的一种方法.我个人感觉这种思路可以学习借鉴,但直接使用的场景应该不大. 我们知道,真正的插入排序通常往前边插入元素后,我们要把后边所有的元素后移 ...

  5. Hark的数据结构与算法练习之希尔排序

    算法说明 希尔排序是插入排序的优化版. 插入排序的最坏时间复杂度是O(n2),但如果要排序的数组是一个几乎有序的数列,那么会降低有效的减低时间复杂度. 希尔排序的目的就是通过一个increment(增 ...

  6. Hark的数据结构与算法练习之桶排序

    算法说明 桶排序的逻辑其实特别好理解,它是一种纯粹的分而治之的排序方法. 举个例子简单说一下大家就知道精髓了. 假如对11,4,2,13,22,24,20 进行排序. 那么,我们将4和2放在一起,将1 ...

  7. Hark的数据结构与算法练习之耐心排序

    算法说明 耐心排序是插入排序的一种,至少wikipedia是这么分的. 话说我明白这个算法的实现思路了,但是不明白这么做的意义何在? 如果明白的朋友帮忙留个言说一下,以后如果我明白的话,我会来修改这个 ...

  8. 数据结构与算法 第八天常见排序+冒泡排序+快速排序+文件IO+大数据排序+文件合并

    数据结构与算法 第八天常见排序+冒泡排序+快速排序+文件IO+大数据排序+文件合并 第一章 冒泡排序 [1]Bubble_Sort.c 第二章 快速排序 [1]quick_sort.c 第三章 大数据 ...

  9. python程序结构有哪几种_Python数据结构与算法(几种排序)小结

    Python数据结构与算法(几种排序) 数据结构与算法(Python) 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺 ...

最新文章

  1. 第三次组织架构变动背后,腾讯AI走向何方?
  2. 从DDD DSL DCI 说起
  3. 游戏服某个服外网玩家连不上,内网才能连
  4. Python3身份运算符(比较对象是否相同)
  5. python-os创建文件夹-create_dir_if_not_exist.py
  6. linux 启动rsyslog服务_linux rsyslog服务部署
  7. jq localStorage
  8. mpvue 中使用 wx-f2 tooltip 失效解决
  9. 【hadoop】hadoop 血缘解析
  10. mysql xa 实现_MySQL数据库分布式事务XA的实现原理分析
  11. c语言2 amp 3结果,C语言里23=什么?
  12. 【Spark】Spark是什么
  13. DIV+CSS样式表命名的规则方法
  14. synchronize——对象锁和类锁
  15. 搜索附近店铺到用户的距离的小经验
  16. 一款基于matlab的图像处理软件
  17. 求解一元二次方程的根
  18. 时空数据生成对抗网络研究综述(下)
  19. 断背山 - 剧情花絮 - 电影 - 风行
  20. 【JAVA SE基础篇】30.抽象与接口

热门文章

  1. 微信小程序开发之——婚礼邀请函-项目展示(4.1)
  2. AI走向“战争技术”,是减少损伤还是推向灾难
  3. js实现图片放大镜效果
  4. Python爬虫入门-python之jieba库制作词云图
  5. 计算机的扩展模式,Win7双屏复制/双屏扩展设置教程
  6. 打马赛克就安全了吗?GitHub热榜的“AI消除马赛克”,上线三天收获近万star
  7. css位置-moz-兼容,兼容不同浏览器的CSS前缀-webkit-,-ms-,-moz-,-o-
  8. HTPPS请求 证书 解决方案
  9. 产品标题什么时候进行优化,提高权重,标题优化的技巧方法
  10. html ul怎么去掉内边距,ul默认有内边距