• 计数排序Counting sort


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

    计数排序的过程类似小学选班干部的过程,如某某人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]);
    
    }
    

      

  • 相关阅读:
    【转载】SAP_ECC6.0_EHP4或SAP_ECC6.0_EHP5_基于Windows_Server_2008R2_和SQL_server_2008下的安装
    使用delphi 开发多层应用(二十四)KbmMW 的消息方式和创建WIB节点
    使用delphi 开发多层应用(二十三)KbmMW 的WIB
    实现KbmMw web server 支持https
    KbmMW 服务器架构简介
    Devexpress VCL Build v2014 vol 14.1.1 beta发布
    使用delphi 开发多层应用(二十二)使用kbmMW 的认证管理器
    KbmMW 4.50.00 测试版发布
    Basic4android v3.80 beta 发布
    KbmMW 认证管理器说明(转载)
  • 原文地址:https://www.cnblogs.com/jxhd1/p/6528107.html
Copyright © 2020-2023  润新知