排序算法 - 计数排序

概念:


计数排序不是一个比较排序算法,该算法于1954年由 Harold H. Seward提出,通过计数将时间复杂度降到了O(N),利用数组下标来缺的元素的正确位置


案例:


假设数组中有10个随机数,取值范围0~10,要求用最快的速度把这20个证书从小到大进行排序

考虑到这些整数只能够在 0、1、2、3、4、5、6、7、8、9、10 这11个数中取值,取值范围有限。所以,可以根据这有限的范围,建立一个长度为11的数组,数组下标从0-10,元素初始值全为0

在这里插入图片描述

假设10个随机数整数值如下

9,3,5,4,9,1,2,7,8,1

第一次计数

在这里插入图片描述

第二次计数

在这里插入图片描述

第三次计数

在这里插入图片描述

第四次计数

在这里插入图片描述

第五次计数

在这里插入图片描述

第六次计数

在这里插入图片描述

第七次计数

在这里插入图片描述

第八次计数

在这里插入图片描述

第九次计数

在这里插入图片描述

第十次计数

在这里插入图片描述

最终,当数列遍历完毕时,数组状态如下

在这里插入图片描述

该数组中每一个下标位置的值代表数列中对应整数出现的次数。

有了这个统计结果,排序就简单多了,直接便利数组,输出数组元素的下标值,元素的值时几,就输出几次

1,1,2,3,4,5,7,8,9,9

显然,现在输出的数列已经是有序的了。

这就是计数排序的基本过程,它适用于一定范围内的整数排序。在取值范围不是很大的情况下,它的性能甚至快过那些时间复杂度为 O(nlogn) 的排序。


代码实现:


public class test {

    public static void main(String[] args) {
        int[] array = new int[] {4,4,6,5,3,2,8,1,7,10};
        int[] sortedArray = countSort(array);
        System.out.println(Arrays.toString(sortedArray));
    }

    public static int[] countSort(int[] array){
        //1. 得到数列最大值
        int max = array[0];
        for (int i = 1; i < array.length; i++) {
            if(array[i] > max){
                max = array[i];
            }
        }
        //2. 根据数列最大值确定统计数组的长度
        int[] countArray = new int[max+1];
        for(int i=0; i<array.length; i++){
            countArray[array[i]]++;
        }
        //遍历统计数组,输出结果
        int index = 0;
        int[] sortedArray = new int[array.length];
        for(int i=0; i<countArray.length; i++){
            for(int j=0; j<countArray[i]; j++){
                sortedArray[index++] = i;
            }
        }
        return sortedArray;
    }

}

[1, 2, 3, 4, 4, 5, 6, 7, 8, 10]

这段代码在开头有一个步骤,就是求数列的最大整数值max。后面创建 的统计数组countArray,长度是max+1,以此来保证数组的最后一个下 标是max。


计数排序优缺点


  1. 当数列最大和最小值差距过大时,并不适合用计数排序

例如给出20个随机整数,范围在0到1亿之间,这时如果使用计数排序,需要创建长度为1亿的数组,不但浪费空间,而且时间复杂度也会随之升高

  1. 当数列元素不是整数时,也不适合用计数排序

如果数列中的元素都是小数,如25.213,或0.00 000 001 这样的数字,则无法创建对应统计数组,这样显然无法进行计数排序。

对于这些局限性,另一种线性时间排序算法做出弥补、这周排序算法叫做桶排序




个人博客地址:http://blog.yanxiaolong.cn | <font color = "orange"> 『纵有疾风起,人生不言弃』 </font>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容

  • 初始计数排序 摘自漫画算法: 计数排序是一种不基于元素比较,利用数组索引来确定元素的正确位置的。 假设数组中有20...
    花逝97阅读 451评论 0 1
  • 题外话计数排序时间性能比之前的排序算法高,在实际中应用较多,只需要O(n)时间即可完成排序。计数排序思想比较巧妙,...
    哪有岁月静好阅读 305评论 0 0
  • 核心思想 计数排序不是基于比较的排序算法,算法的核心有3点:统计原数组中每个元素出现的次数。以原数组中的元素为下标...
    Alisallon阅读 906评论 0 1
  • 前面说的那些排序算法,都是要通过比较来实现的。排序还能不通过比较来实现?是的,计数排序就是这么神奇。 一、排序思想...
    贪挽懒月阅读 351评论 0 1
  • 计数排序 基本思想:不通过比较,计下每个元素的出现次数,统计小于这个元素的个数N,将其放在N位。例如{7,6,2,...
    守敬阅读 2,102评论 1 2