排序算法总结(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之前,则称这种排序算法是稳定的;否则称为不稳定的。)

算法数据结构C++实现4-计数排序(counting sort)

这里是 Introduction to Algorithm 算法导论书中第八章的计数排序 counting sort, 本专题还是以这本书为主,用c++实现其中最重要的算法。 网上也有很多高手研究了这...
  • kenden23
  • kenden23
  • 2013年10月08日 16:08
  • 1730

经典算法——计数排序算法

计数排序: 该算法于1954年由 Harold H. Seward 提出。 它是一个不需要比较的,类似于桶排序的线性时间排序算法。该算法是对已知数量范围的数组进行排序。...
  • gaoruxue918
  • gaoruxue918
  • 2017年03月12日 00:06
  • 685

计数排序C语言实现

计数排序是稳定排序,而且是线性时间内的排序算法,时间复杂度是O(n + k)其中k是待排序数组的范围。计数排序不是原址排序,空间复杂度是O(n + k) //k是指A中的数组范围是0...
  • XianBT
  • XianBT
  • 2015年08月04日 00:12
  • 824

【算法导论】c++实现计数排序

计数排序的基本思想为:对每一个输入的元素x,确定出小于x的元素的个数。有了这一信息,那么就可以把x直接放到相应的位置上。 特点: 1 需要临时的存储空间,如果排序数据范围特别大时,空间开销很大。 ...
  • Harry_lyc
  • Harry_lyc
  • 2012年07月06日 15:23
  • 2275

计数排序及其C++实现

计数排序 COUNTING_SORT计数排序假设n个输入元素中每一个都是在0到k区间内的一个整数。其中k为某个整数。当k=O(n)时,排序的运行时间为Θ(n).计数排序的基本思想是:对每一个输入元素x...
  • u010525694
  • u010525694
  • 2017年05月30日 21:56
  • 381

经典算法之计数排序

一 引言 计数排序假设n个输入元素中的每一个都是介于0-k的整数,此处k为某个整数。当k等于O(n)时,计数排序的运行时间为Θ(n)。 二 基本思想 计数排序的基本思想就是对每一个输...
  • SunnyYoona
  • SunnyYoona
  • 2014年04月26日 19:18
  • 2949

排序算法之 计数排序 及其时间复杂度和空间复杂度

计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排...
  • YuZhiHui_No1
  • YuZhiHui_No1
  • 2015年03月23日 11:44
  • 3393

可以进行原地排序的计数排序

如题,算法导论上给出的计数排序需要额外申请O(n)的空间来存储排好序的结果。 在算法导论(第二版)8-2思考题中,提出能否只需要O(k)的空间复杂度,对计数排序进行修改,实现原地排序。 下...
  • Will_Lee_Buaa
  • Will_Lee_Buaa
  • 2013年11月27日 13:40
  • 1300

排序算法之线性排序(计数排序和桶排序)--Java语言

之前的文章讲到的都是比较算法,以下链接是之前文章提到过的一些基本排序方法,其时间复杂度的下界是O(nlogn)。今天提到的两个主角分别是计数排序和桶排序,其时间复杂度好的情况下能够达到O(n),它们不...
  • carson0408
  • carson0408
  • 2017年11月28日 15:19
  • 624

计数排序(C语言版)

先说说计数排序的思想: 计数排序假定待排序的所有元素都是介于0到K之间的整数;计数排序使用一个额外的数组countArray,其中第i个元素是待排序数组array中值等于i的元素的个数。然后根据数组c...
  • Thinkpad4180NC5
  • Thinkpad4180NC5
  • 2014年10月17日 00:39
  • 2357
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:排序算法总结(8)--计数排序
举报原因:
原因补充:

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