排序算法总结(8)--计数排序

原创 2017年05月23日 16:56:38

一、简介

之前介绍的排序算法都是比较排序算法,时间复杂度最小为O(nlgn)。计数排序不需要元素之间的比较。前提条件是序列中的每一个元素都是0-k之间的一个整数。所谓计数,即统计每个元素出现的次数,然后对于每个元素x,确定小于x的元素的个数。利用这一信息,直接将x放在输出数组中正确的位置。

二、伪代码

countSort(A,B,k)
//A是待排序数组,B存储排序后数组,k>=A中最大值
    初始化一个长度为k+1的数组C,每个元素为零
    //统计每个元素的个数
    for i=0 to A.length-1
        C[A[i]]=C[A[i]]++
    //对每个元素想,计算比x的元素的个数
    for j=1 to k
        C[i]=C[i]+C[i-1]
    //对元素x,根据比x小的元素的个数,将元素归位
    for i=A.length-1 to 0
        B[C[A[j]]]=A[j]
        C[A[j]]--   

三、代码实现

    public static void countsort(int[] input, int[] output, int k) {  
        int[] c = new int[k+1];

        for (int i = 0; i < input.length; i++) {  
            c[input[i]]++;  
        }  

        for (int i = 1; i < k+1; i++) {  
            c[i] = c[i] + c[i - 1];  
        }  

        for (int i = input.length - 1; i >= 0; i--) {
            output[c[input[i]] - 1] = input[i];  
            c[input[i]]--;
        }  
    }  

四、注意事项

1、计数排序不需要比较元素,但是对待排序的序列有一定的要求,序列中的每一个元素都是0-k之间的一个整数。
2、计数排序不属于比较排序的范围,所以其时间复杂度可以打破比较排序的下界,总的时间代价为O(k+n)。在实践中,令k=O(n),时间复杂度为O(n)。
3、计数排序是稳定的。(假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。)

相关文章推荐

计数排序算法实例

  • 2012年11月29日 09:42
  • 574KB
  • 下载

常用排序算法总结9一一计数排序

计数排序(英语:Counting Sort)是一种稳定的线性时间排序算法。计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。...

排序算法总结(一)计数排序

比较排序算法时间复杂度下界为O(nlogn),这里介绍一种非比较排序算法:计数排序,其时间复杂度为O(n)。   计数排序原理   假定有三个数组,A,B,C,A为待排序数组,B为输出数组,C为临时数...

排序算法总结之计数排序 Counting Sort

算法原理: 排序算法根据排序的原理可以分为两类:基于比较的和非比较的。常见的基于比较的排序算法有快速排序,堆排序,归并排序等,基于比较的排序算法平均情况最好是O(nlogn)。基于非比较的排序算法有三...

计数排序算法(C语言实现)

计数排序,  比较适合数值跨度比较小的,  也就是数组中最大值减去最小值得到的值尽量小,  同时数组元素又比较多的情况下用计数排序效率比较高,同时,计数排序算法基友稳定性。 计数排序的时间复杂度为O...

计数排序算法详解

经典排序算法 - 计数排序Counting sort 注意与基数排序区分,这是两个不同的排序 计数排序的过程类似小学选班干部的过程,如某某人10票,作者9票,那某某人是班长,作者是副班长 ...

计数排序算法(c语言测试)(稳定版本)

#include /*计数排序 一个稳定不需要比较 效率为线性的算法 基本原理:: 通过借助临时数组的下标来记录 需要排序数组中值排序后 的正确位置 ...
  • andan14
  • andan14
  • 2013年06月26日 12:10
  • 357

计数排序算法

上篇文章介绍了:生成一定范围内的互不相等随机整数的一种算法。并将生成的结果存入了一个文件,现在我们要把这些数按从小到大排序后,重新放入一个文件。         这个问题应该怎么解决呢?     ...

C++ 计数排序算法的实现与改进(含笔试面试题)

计数排序局限性比较大,算法思想:假定输入是有一个小范围内的整数构成的(比如年龄等),利用额外的数组去记录元素应该排列的位置,思想比较简单。 计数排序是典型的不是基于比较的排序算法,基于比较的排序算法...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:排序算法总结(8)--计数排序
举报原因:
原因补充:

(最多只允许输入30个字)