关闭

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

标签: 排序算法
52人阅读 评论(0) 收藏 举报
分类:

一、简介

之前介绍的排序算法都是比较排序算法,时间复杂度最小为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之前,则称这种排序算法是稳定的;否则称为不稳定的。)

0
0

猜你在找
C语言及程序设计(讲师:贺利坚)
Python爬虫工程师培养课程全套(讲师:韦玮)
Python全栈开发入门与实战课(讲师:李杰)
2017软考网络规划设计师视频套餐(讲师:任铄)
2017软考软件设计师视频套餐(讲师:任铄)
2017软考-信息系统项目管理师视频套餐(讲师:任铄)
软考(高级)项目经理实战营(讲师:张传波)
微信公众平台开发套餐(讲师:刘运强)
深度学习原理+实战+算法+主流框架套餐(讲师:唐宇迪)
2017系统集成项目管理工程师通关套餐(讲师:徐朋)
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2105次
    • 积分:154
    • 等级:
    • 排名:千里之外
    • 原创:14篇
    • 转载:6篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档