1 本节思路

之前的算法的最基本的思想是比较元素大小,所以算法复杂度最好是Θ(nlogn)\Theta(nlogn)Θ(nlogn),本节不再基于元素比较,而是基于计数的Counting sort,然后应用在Radix sort上。

2 Counting sort

2.1 算法思想

Counting sort算法的思想比较简单,就是通过统计每个数字的的个数确定每个数字的位置,譬如【8,6,2】这三个数,通过计数统计知道#8=1,#6=1,#2=1,很自然就是2排正位置1上,6排在位置1+1=2上,8排在位置2+1=3上,因为每个数字都是不重复,所以看起来很low,考虑到有充分数字的情况,就会领会到这个算法的巧妙之处了。

2.2 算法演示

2.3 算法描述

2.4 算法实现

# -*- coding: utf-8 -*-
import collectionsdef counting_sort(A, B, k):# let C[0..k] be a new arrayC = [0] * (k + 1)for i in range(k + 1):C[i] = 0for j in range(1, len(A)):C[A[j]] = C[A[j]] + 1# C[i] now contains the number of elements equal to i.for i in range(1, k + 1):C[i] = C[i] + C[i - 1]# C[i] now contains the number of elements less than or equal to i.for j in range(len(A) - 1, 0, -1):B[C[A[j]]] = A[j]C[A[j]] = C[A[j]] - 1if __name__ == '__main__':A = ['x', 2, 5, 3, 0, 2, 3, 0, 3]B = [0] * len(A)k = max(A[1:])print('before sort:', A[1:])counting_sort(A, B, k)print('after sort:', B[1:])

运行结果:

before sort: [2, 5, 3, 0, 2, 3, 0, 3]
after sort: [0, 0, 2, 2, 3, 3, 3, 5]

2.5 算法分析

容易得到Counting sort的算法复杂度是O(k+n)O(k+n)O(k+n),k为集合中元素个数,n为排序序列中元素个数,因为k<nk<nk<n,所以可以认为这个算法是线性时间复杂度,其原因就是空间换时间,所以 其用途在于小范围内的数据,如果数据范围过大(排序的元素个数不一定很多)会占用大量的内存,下面Radix sort正好可以应用到这一点。

3 Radix sort

3.1 Radix sort算法思想

Radix sort按位从后至前排序,因为要防止重复数字问题,所以顺序是从后至前。下面的演示很简单的表达了这种思想:

3.2 算法描述


这里stable sort 指的是counting sort。

3.3 算法分析

  • 考虑一个极端的情况,在一个b=32位的计算机上,每一个数字都可以表示为b个bit的序列,此时b=log2nb=log_2{n}b=log2​n,应用上面的lemma8.3容易得到,在这种情况下使用RADIX-SORT的算法复杂度是Θ(b(n+2))=Θ(logn(n+2))\Theta(b(n+2))=\Theta(logn(n+2))Θ(b(n+2))=Θ(logn(n+2)),之前的基于“元素比较”排序算法没有什么提高。
  • 考虑另一个方向的极端情况,假如计算机内存超级大随便用(不考虑缓存消耗),那么上面问题的复杂度是Θ(n+32)\Theta(n+32)Θ(n+32),理论上完美,实际上不可信。
  • 两个极端的情况之间存在着一种权衡,这种权衡关系如下面lemma8.4所示,这个lemma8.4中使用适当的颗粒度r作为一位进行counting sort。

  • 有点问题。。。待续。。。

八、计数排序及其应用分析相关推荐

  1. C++算法之计数排序

    C++算法之计数排序 文章目录 C++算法之计数排序 一.算法描述 二.代码实现 三.复杂度分析 一.算法描述 给定长度为n的序列,假设已知序列元素的范围都是[0..K]中的整数,并且K的范围比较小( ...

  2. 计数排序的应用与分析

    /* 问题描述:某公司有几万名员工, 请完成一个时间复杂度为O(n)的算法对该公司员工的年龄做排序, 要 求空间复杂度为O(1) 问题分析:因为人的年龄总共也不会超过100岁,所以可以创建一个大小为1 ...

  3. 计数排序及其改进 C++代码实现与分析 恋上数据结构笔记

    文章目录 复习梗概 算法思想 基础思想 改进空间复杂度,改进不能对负数进行排序问题 改进稳定性 计数排序时间空间复杂度 计数排序基础版 代码及输出 计数排序第一次改进版 代码及输出 计数排序终极版 代 ...

  4. 八十五、再探希尔排序,桶排序,计数排序和基数排序

    @Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. ---- Runsen 关于排序,其实还有很多,比如常见的希尔排序,桶排序,计数排序和基数排 ...

  5. 算法学习总结(八):计数排序

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

  6. 【排序算法】计数排序引发的围观风波——一种O(n)的排序

    前言 计算机课上,老师给一串数字6 1 6 9 9 1 4 2 1 5 8 8,问道:这一串数字,你们写个程序给我看,要求效率较高.学不出来的别下课了. 顿时场下一片哗然,但有很多小朋友硬着头皮啪啪啪 ...

  7. 归并排序改良 java_Java 八种排序算法总结

    image 前言 好久没复习基础了,写个冒泡排序都要想一会.感觉自己好像老了好多,今天手痒总结一下排序算法.目前网上博客普遍都有详细介绍,写的很清楚.说实话我是没必要再写一遍的,感觉就是在啰嗦.还是重 ...

  8. 计数排序、桶排序和基数排序的运算性能对比及总结区别(附python代码)

    首先证明一波排序算法的运算性能,如下图.对于50万个数据的无序列表,时间复杂度为的桶排序和计数排序明显比复杂度为的归并排序和快速排序性能好至少一个数量级. 1. 计数排序  1.1 基本原理:首先确定 ...

  9. 算法导论-排序(四)计数排序(线性时间排序)

    目录 1.计数排序介绍 2.流程图 3.代码实现 4.性能分析 5.参考资料 内容 1.计数排序介绍 什么是计数排序? 计数排序是一种特殊的排序算法,之前介绍的排序算法需要对数进行两两比较,效率下界为 ...

最新文章

  1. .NET 关于Geometry转GeoJson
  2. dataframe常用操作_Pandas | Dataframe的merge操作,像数据库一样尽情join
  3. LoadRunner安装
  4. linux互传文件nc命令
  5. Linux--信号阻塞与屏蔽
  6. 网站五万ip需要服务器,30万IP网站要用什么样的服务器?
  7. [译] 五个小技巧让你写出更好的 JavaScript 条件语句
  8. c语言数码管按下k1显示1,单片机C语言程序的设计实训100例_基于8051+PROTEUS仿真1.docx...
  9. Mac环境下AndroidStudio关于 Failed to resolve: org.jetbrains.kotlin:kotlin-stdlib-jre7的错误
  10. 单片机温度传感器c语言编码,基于单片机的温度传感器18b20的C语言程序
  11. js将阿拉伯数字转化成大写
  12. 以赛促产 以赛引才 |第六届世界智能大会·中国华录杯数据湖算法大赛正式启动
  13. 关于用WinHex解析vm虚拟机的.vmdk文件。
  14. 《时代三部曲》感悟四
  15. uva 10066 The Twin Towers (最长公共子序列)
  16. 第七章递归知识讲解。
  17. 【魔改蜗牛星际】B双主板变“皇帝板”扩展到8个SATA口
  18. JETT(三)-多Sheet渲染
  19. python re search match_简诉Python Re模块中re.search和re.match的区别
  20. 中秋祝福代码,中秋快乐代码,采用H5制作的中秋动画祝福

热门文章

  1. 前端学习(1324):anysc关键字
  2. java学习(143):file方法类实现
  3. 解决 “数据大屏“ 展示的屏幕适配问题
  4. 是什么东西_隐形牙套附件是什么东西?
  5. python整数因子_Python:通过非整数因子下采样2D numpy数组
  6. sql 链接到oracle数据库,通过MSSQL连接服务器连接至Oracle数据库
  7. ue4导入倾斜摄影_倾斜摄影建模干货|还怕搞不定CC空三?这里只要5分钟……
  8. LOJ 2979 「THUSCH 2017」换桌——多路增广费用流
  9. volatile理解了吗?
  10. 【网络流24题----09】方格取数问题