注意与基数排序区分,这是两个不同的排序

计数排序的过程类似小学选班干部的过程,如某某人10票,作者9票,那某某人是班长,作者是副班长

大体分两部分,第一部分是拉选票和投票,第二部分是根据你的票数入桶

看下具体的过程,一共需要三个数组,分别是待排数组,票箱数组,和桶数组

var unsorted = new int[] { 6, 2, 4, 1, 5, 9 };  //待排数组

var ballot = new int[unsorted.Length];          //票箱数组

var bucket = new int[unsorted.Length];          //桶数组

最后再看桶数组,先看待排数组和票箱数组

初始状态,迭代变量i = 0时,待排数组[i] = 6,票箱数组[i] = 0,这样通过迭代变量建立了数字与其桶号(即票数)的联系

待排数组[ 6 2 4 1 5 9 ] i = 0时,可以从待排数组中取出6

票箱数组[ 0 0 0 0 0 0 ] 同时可以从票箱数组里取出6的票数0,即桶号

拉选票的过程

首先6出列开始拉选票,6的票箱是0号,6对其它所有数字说,谁比我小或与我相等,就给我投票,不然揍你

于是,2 4 1 5 分别给6投票,放入0号票箱,6得四票

待排数组[ 6 2 4 1 5 9 ]

票箱数组[ 4 0 0 0 0 0 ]

接下来2开始拉选票,对其它人说,谁比我小,谁投我票,不然弄你!于是1投了一票,其他人比2大不搭理,心想你可真二

于是2从1那得到一票

待排数组[ 6 2 4 1 5 9 ]

票箱数组[ 4 1 0 0 0 0 ]

再然后是,

4得到2和1的投票,共计两票

1得到0票,没人投他

5得到2,4,1投的三张票

9是最大,得到所有人(自己除外)的投票,共计5票(数组长度-1票)

投票完毕时的状态是这样

待排数组[ 6 2 4 1 5 9 ]

票箱数组[ 4 1 2 0 3 5 ]

入桶的过程

投票过程结束,每人都拥有自己的票数,桶数组说,看好你自己的票数,进入与你票数相等的桶,GO

6共计5票,进入5号桶

2得1票,进入1号桶,有几票就进几号桶

4两票,进2号桶,5三票进3号桶,9有5票,进5号桶

待排数组[ 6 2 4 1 5 9 ]

票箱数组[ 4 1 2 0 3 5 ]

-----------------------

入桶前 [ 0 1 2 3 4 5 ] //里边的数字表示桶编号

入桶后 [ 1 2 4 5 6 9 ] //1有0票,进的0号桶

排序完毕,顺序输出即可[ 1 2 4 5 6 9]

可以看到,数字越大票数越多,9得到除自己外的所有人的票,5票,票数最多所以9最大,

每个人最多拥有[数组长度减去自己]张票

1票数最少,所以1是最小的数,

计数排序同时兼有桶排的高效和快排的霸道,

完成代码如下

var unsorted = new int[] { 6, 2, 4, 1, 5, 9 };  //待排数组

var ballot = new int[unsorted.Length];          //票箱数组

var bucket = new int[unsorted.Length];          //桶数组

for (int i = 0; i < bucket.Length; i++)

{

//unsorted[i] = 6

//ballot[i]是6的票箱,里边有4张票

//bucket[ballot[i]] = unsorted[i];

//bucket[4张票] = 6;

bucket[ballot[i]] = unsorted[i];

}

for (int i = 0; i < bucket.Length; i++)

{

Console.WriteLine(bucket[i]);

}

经典排序算法(十七)--计数排序Counting Sort相关推荐

  1. 排序算法之计数排序、基数排序和桶排序

    转自:http://www.cnblogs.com/ttltry-air/archive/2012/08/04/2623302.html 计数排序,基数排序,桶排序等非比较排序算法,平均时间复杂度都是 ...

  2. java sorted排序_【算法】排序算法之计数排序

    前几回,我们已经对冒泡排序.直接插入排序.希尔排序.选择排序.快速排序.归并排序.堆排序做了说明分析.本回,将对计数排序进行相关说明分析. 一.排序算法系列目录说明 冒泡排序(Bubble Sort) ...

  3. c++ 二维数组 排序_【算法】排序算法之计数排序

    前几回,我们已经对[算法]排序算法之冒泡排序.[算法]排序算法之插入排序.[算法]排序算法之希尔排序.[算法]排序算法之选择排序.[算法]排序算法之快速排序.[算法]排序算法之归并排序.[算法]排序算 ...

  4. 【排序算法】计数排序引发的围观风波——一种O(n)的排序

    前言 计算机课上,老师给一串数字6 1 6 9 9 1 4 2 1 5 8 8,问道:这一串数字,你们写个程序给我看,要求效率较高.学不出来的别下课了. 顿时场下一片哗然,但有很多小朋友硬着头皮啪啪啪 ...

  5. 排序算法(6)----计数排序

    不知道为什么,突然编辑器不支持颜色丰富的intellij IDEA直接复制了,博主有点沮丧,因此我先用图片的形式展示并分析,然后在最后会将全部代码呈上 排序思想:在一个数组中,对于每一个数据,都统计有 ...

  6. 【排序算法】计数排序

    当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k).计数排序不是比较排序,排序的速度快于任何比较排序算法. 由于用来计数的数组B的长度取决于待排序数组中数据的范围(等于 ...

  7. Python排序算法之计数排序

    目录 简介 代码示例 简介 已知列表的元素范围在0到100,设计一个复杂度为O(n)的算法在类似这种情况下,计数排序比sorted还要快 代码示例 #!/usr/bin/python3 # -*- c ...

  8. 排序算法:计数排序(Python)

    思路:计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中.作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数. 一图解百惑,上图!  话不多说,上代码! def ...

  9. [Alg]排序算法之分布排序

    [Alg]排序算法之分布排序 作者:屎壳郎 日期:Aug 2021 版次:初版 简介: 分布排序是与归并排序截然相反的处理思路,归并排序是逐步融合归并,而分布排序是分组然后合并,再分组再合并,所以分布 ...

  10. 经典排序算法 - 鸽巢排序Pigeonhole sort

    经典排序算法 - 鸽巢排序Pigeonhole sort 原理类似桶排序,同样需要一个很大的鸽巢[桶排序里管这个叫桶,名字无所谓了] 鸽巢其实就是数组啦,数组的索引位置就表示值,该索引位置的值表示出现 ...

最新文章

  1. 2008年 浙工大考研计算机专业课试题C++
  2. AdminIII连接linux Postgresql过程中的几个小问题
  3. excel 两组数据交点_30秒即可完成Excel数据对比,超高效率,快学起来不要犹豫!...
  4. JAVA学习--集合的遍历
  5. 在storm中使用定时保存
  6. HTML5须知的特征和技术
  7. 32bit win7 在VMWARE中安装64位的redhat LINUX4.7
  8. Babelfish (关于mapstring,string的用法
  9. stm32F4驱动AD7793程序-ADC模拟前端-应用详解,应该是最全了
  10. 升序输出三个数_C语言入门经典例题:求100~999的水仙花数
  11. 点云数据格式及处理工具
  12. CAD中怎么配置灭火器?
  13. Linux下Firefox安装flash操作
  14. android 汉字转字节,安卓汉字转拼音
  15. 分布式数据一致性的探讨
  16. Java毕设项目大学生创业众筹系统(java+VUE+Mybatis+Maven+Mysql)
  17. 【华为云技术分享】物联网SIM卡和SIM卡,真的不是一回事
  18. 远程linux桌面的工具xshell,Xshell如何远程桌面连接Linux系统 Xshell远程桌面连接Linux系统操作流程...
  19. matlab与python语法区别(持续更新)
  20. 销售管理系统哪种好?

热门文章

  1. 我觉得很有必要好好看看JavaScript
  2. Koa2 和 Express 中间件对比
  3. 序列化之Java默认序列化技术(ObjectOutputStream与ObjectInputStream)
  4. RHEL服务器配置BIND以及实现DNS负载均衡
  5. Android通过post请求发送一个xml,解析返回xml数据
  6. C#ORM系统 Moon.ORM使用方法
  7. \sbin\nginx:cannot execute binary file
  8. J2EE项目架构最佳实践
  9. 前期拍摄注意的简要几点,总结了一哈,与大家分享!
  10. bad response Not Found 404