凡是学过数据结构的朋友们大多熟悉一些排序算法,插入排序、冒泡排序、快速排序、和堆排序等。这些排序总的来说都是于比较排序算法,也就是说要对容器中的数据进行大小的比较。在这里合并排序和堆排序都采用了算法中经常使用的一种策略,分而治之来提高效率。他们都属于渐进最优的比较排序算法,时间复杂度达到了O(nlgn),很优秀了,不是么?这里不再唠叨那些比较常见的排序算法,在接下来的几天,我给大家介绍分别介绍计数排序、基数排序和桶排序。
我们所要排序的数据往往是有一定规律的,甚至我们可以对排序数据做某种假设,告诉他们,我的代码在什么什么情况下使用的效率是多么多么的出色。正所谓没有万能的理论,没有万能的代码。计数排序假设输入数据是由一个小范围的数据构成,而且我们利用空间换取了时间。看个例子吧。

void CountingSort(const char *A, int len, char **ret)
{
    if(len < 2 || !ret || !A)
    {
        return;
    }
    
    int Temp[256];
    for(int i = 0; i < 256; i++)
    {
        Temp[i] = 0;
    }
    
    for(int i = 0; i<len; i++)
    {
        Temp[int(A[i])]++;
    }

for(int i = 1; i<256;i++)
    {
        Temp[i]=Temp[i]+Temp[i-1];
    }

for(int i = len-1; i >= 0 ; i--)
    {
        (*ret)[Temp[int(A[i])]-1] = A[i];
        Temp[int(A[i])]--;
    }
}

上面代码是计数排序的一个简单实现,是对字符以ASCII码值的大小进行排序。所以作者要在排序过程中申请一个256整型大小的临时空间,这是用来存储ASCII码为n的字符前面有多少个字符的临时变量。
代码是比较容易看懂的,该算法的基本思想就是对于每个输入数据x,确定出小于他的元素的个数,有了这个就可以把x放到最终输出的位置了。最后要说的是,计数排序可是个时间复杂度为O(n)的稳定排序啊。

转载于:https://www.cnblogs.com/BruceZhao/archive/2007/12/16/996846.html

时间复杂度为O(n)的计数排序算法相关推荐

  1. 经典排序算法(11)——计数排序算法详解

    计数排序(Counting sort)是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出.它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k ...

  2. c ++递归算法数的计数_计数排序算法–在C / C ++中实现的想法

    c ++递归算法数的计数 What is the counting sort algorithm? In Computer Science, sorting algorithms form the b ...

  3. 理解计数排序算法的原理和实现

    计数排序(Counting sort)是一种稳定的线性时间排序算法,其平均时间复杂度和空间复杂度为O(n+k),其中n为数组元素的个数,k为待排序数组里面的最大值.同样具有线性时间排序的算法还有桶排序 ...

  4. JavaScript实现CountingSort计数排序算法(附完整源码)

    JavaScript实现CountingSort计数排序算法(附完整源码) Comparator.js完整源代码 Sort.js完整源代码 CountingSort.js完整源代码 Comparato ...

  5. 使其正序排序 打印一串数字_JavaScript计数排序算法

    一.计数排序算法 计数排序(Counting sort)是一种稳定的线性时间排序算法.该算法于1954年由 Harold H. Seward 提出.计数排序使用一个额外的数组,数组的下标对应待排序的数 ...

  6. 计数排序:时间复杂度仅为 O(n) 的排序算法

    一.简介 计算排序假设 n 个输入元素都是 0 到 k 区间内的一个整数,其中 k 为某个整数. 基本原理: 创建一个长度为 k+1 的数组 count[],它的 count[i] 的值对应输入数组中 ...

  7. 计数排序算法——C++

    计数排序是时间复杂度为 O(n)的算法,空间复杂度为O(n):算法思想跟散列表哈希hash有些类似,主要是利用一段有序数组计算对应元素的下表个数,然后依次输出有数组元素进行排列.基本计数排序是不稳定算 ...

  8. c++之计数排序算法

    1.计数排序   计数排序(Counting sort) 是一种稳定的排序算法.计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数.然后根据数组C来将A中的元素排到正确的 ...

  9. php常用算法的时间复杂度,php的几个经典排序算法及时间复杂度和耗时​

    $arr = []; for ($i=0; $i 测试结果:排序用时(秒):5.2821290493011 php排序里的经典算法首先想到的就是冒泡排序法, 排序思想:两两交换小数上浮大数下沉每轮浮出 ...

  10. 基础算法-2: 时间复杂度为O(N*logN)的排序算法

    时间复杂度 O(N*logN): 归并排序,堆排序(大根堆,小根堆,heapInsert/heapify),快速排序(荷兰国旗问题). 归并排序 L - Mid - R 先让 左有序,右有序. 归并 ...

最新文章

  1. Prim算法求权数和,POJ(1258)
  2. FreeSWITCH在呼叫失败的情况下如何播放语音提示
  3. 经常使用的MySQL语句整理
  4. Winpcap进行抓包,分析数据包结构并统计IP流量
  5. cascade在java_【Java基础】集合
  6. web.config配置数据库连接
  7. [css] 如何清除在项目中无用的css代码呢?
  8. 的写法_朋友圈文案标题的写法
  9. padavan安装php,求助!帮忙解决newifi3路由器安装hiboy老毛子系统后开启onmp后打开phpmyadin出错!...
  10. apt-get安装mysql
  11. windows10环境下node js版本快速升级
  12. 全双工音频播放器在c#中使用waveIn / waveOut api
  13. 用浏览器控制台查看ajax请求
  14. Java编程:排序算法——希尔排序
  15. 日本公司推出第一款MR购物应用,今秋上市
  16. 1-4 正弦和余弦
  17. Windows XP 深度增强精简版下载 - Deepin XP Lite V2
  18. 如何成为一名白帽子?
  19. Tiny语言编译器简介
  20. 微软量子论文撤稿,谷歌“量子霸权”受质疑,量子计算的狂热需一盆冷水清静

热门文章

  1. MultiRow发现之旅(五)- MultiRow版俄罗斯方块(exe + 源码)
  2. null值是不会算在count以内的
  3. Java 学习第一天
  4. AMD:40年三个关键词
  5. 整理了一些DataGrid ColumnStyle
  6. Java StringTokenizer类使用方式
  7. Android studio 的那些坑
  8. 数据--第37课 - 线索化二叉树
  9. 数据结构:内排序(C++)
  10. 在边缘计算大热的背景下,为何Akamai敢说自己就是边缘