zoukankan      html  css  js  c++  java
  • 排序算法之计数排序

     

    排序是算法与数据结构中最基本的一个模块,而我参加的两次笔试一次面试都在排序算法上有所体现,所以一开始我就从排序算法开始说起。

    排序算法真是太多了,各种排序怎样去选择呢?主要有几个衡量的指标:

    • 时间复杂度:主要有O(n2)O(nlgn)以及线性的排序算法;

    • 空间复杂度:有些排序算法需要额外的辅助空间,而有些则能实现“原地排序”;

    • 稳定性:相同的元素在排序之前和排序之后相对位置是否有可能发生变化;

    • 适用条件:算法是否有些额外的限制条件。

    今天我先介绍一种线性的排序算法——计数排序(Counting Sort)。

    计数排序假设n个输入元素中的每一个都是介于0-k的整数,此处k为某个整数。计数排序顾名思义离不开计数,我们要计的是输入元素中相同元素出现的次数。对每一个输入元素x,确定小于x的元素的个数,那样排序之后,x在最终输出数组中的位置就可以确定了。例如:如果有17个元素小于x,则x就位于第18个输出的位置上。当然有几个元素相同时,这个方法就略微改进一下,因为不能将它们放在同一个位置上。

    假定输入数组为A[1..n],他们的值均位于0~k之间,输出排序之后的数组为B[1..n],以及临时存储数组C[0..k]。计数排序的伪代码如下:

     

    计数排序的特点:

    1.      提前必须是已知待排序的关键字为整型且范围已知。

    2.      时间复杂度为O(n+k),不是基于比较的排序算法,因此效率非常之高。

    3.      稳定性好,这个是计数排序非常重要的特性,可以用在后面介绍的基数排序中。

    4.      但需要一些辅助数组,如C[0..k],因此待排序的关键字范围0~k不宜过大。而B[1..n]用来存放排序结果,我们可以对上述算法进行改进,使排序在原地进行。改进之后如下:

     

    源代码下载地址:

    http://download.csdn.net/source/3246187

     


    参考文献:

           [1]  《新编 实用算法分析与程序设计》 王建德,吴永辉 编著  人民邮电出版社

           [2]  《算法技术手册》  George T.Heineman 著, 杨晨 李明 译    机械工业出版社

     

    版权申明:版权所有,翻版不究!欢迎学习交流。如发现BUG,恳请批评指正!

    Creative Commons License

    本博客的内容如果没有标注转载字样,均属个人原创!欢迎学习交流,如果觉得有价值,欢迎转载,转载请注明出处,谢谢!

    邮箱:haifenglinying#yahoo.cn (#->@)

    个人主页:www.hazirguo.com

  • 相关阅读:
    我的浏览器收藏夹分类
    我的浏览器收藏夹分类
    Java实现 LeetCode 318 最大单词长度乘积
    Java实现 LeetCode 318 最大单词长度乘积
    Java实现 LeetCode 318 最大单词长度乘积
    Java实现 LeetCode 316 去除重复字母
    Java实现 LeetCode 316 去除重复字母
    Java实现 LeetCode 316 去除重复字母
    Java实现 LeetCode 315 计算右侧小于当前元素的个数
    Java实现 LeetCode 315 计算右侧小于当前元素的个数
  • 原文地址:https://www.cnblogs.com/hazir/p/2447291.html
Copyright © 2011-2022 走看看