常见的排序算法,像归并排序,堆排序时间复杂度为O(nlgn);像冒泡排序,插入排序则为O(n^2)。对于排序算法而言,只要你是通过比较,O(nlgn)是一条难以逾越的界限。为了追求更快的速度,智慧的人类发明了一种新的方法——计算排序(Counting sorts),在这种算法中没有比较运算,下面简单的介绍一下。

对于这个算法,有个比较重要的约束条件——排列的数据必须在特定的范围,我们假设区间范围为[1, k]。

用到3个数组,A[ ]表示需整理的原数组,B[ ]表示输出的数组结果,C[i ](1<= i <= k)表示在A中每个元素出现的频率,比如C[1]=2表示数组中元素1出现2次。

伪代码如下:

for i= 1 to k

do C[i] = 0; //将数组C 各个值初始化为0

for j = 1 to n

do C[a[j]] = C[a[j]] + 1; // 计算每个元素出现的频率

for i = 2 to k

do C[I] = C[I] + C[I-1]; //  此时的C[i] 表示元素小于等于i的频率,前缀加法

for j = n to 1

do B[C[A[j]] = A[j]

C[A[j]] = C[A[j]] - 1;  //最后为分配,较难理解,结合实例自己画画有助于理解

该方法时间复杂度为O(k+n),所以使用时结合k与n的大小,由于排序算法最优为O(nlgn),So

if k <nlgn  use Counting sorts

else   use Merge sort,由此可见该方法一般处理数据规模较小的序列。

方法二  基数排序算法:可以处理大规模数据,以方法一为基础

主要思想为由低位到高位,按位排序,比如数据{ 237,393, 456},经过

个位排序{ 393, 456, 237 } ——》十位排序{ 237, 456, 393 }  ——》 百位排序{ 237, 393, 456}从而得到最终结果。

MIT算法导论5——线性时间排序相关推荐

  1. 【算法学习】线性时间排序-计数排序、基数排序和桶排序详解与编程实现

    计数排序 计数排序假设n个输入元素中的每一个都是介于0到k之间的整数.此处k为某个整数(输入数据在一个小范围内). 算法思想 计数排序的基本思想是对每一个输入元素x,确定出小于x的元素的个数.然后再将 ...

  2. 时间排序python_算法导论 第八章 线性时间排序(python)

    比较排序:各元素的次序依赖于它们之间的比较{插入排序O(n**2) 归并排序O(nlgn) 堆排序O(nlgn)快速排序O(n**2)平均O(nlgn)} 本章主要介绍几个线性时间排序:(运算排序非比 ...

  3. 算法导论-线性时间排序习题解

    8.1-3 证明:对于长度为n的n!中输入中至少一半而言,不存在线性时间的比较排序算法.对于n!中的1/n部分而言又怎样呢?1/2n部分呢? 解:即在决策树模型中求1/2, 1/n, 1/2n 部分的 ...

  4. 最大子数组问题 线性时间_我最喜欢的线性时间排序算法

    最大子数组问题 线性时间 by Franziska Hinkelmann 通过Franziska Hinkelmann 我最喜欢的线性时间排序算法 (My Favorite Linear-time S ...

  5. MIT 算法导论 (二)Math Notation

    MIT 算法导论 (二)Math Notation O: f(n) = O(g(n)) ,  means that there are some suitable constants,such tha ...

  6. MIT算法导论03-分治法

    MIT算法导论03-分治法(Divide and Conquer) 课程名:Introduction to Algorithms 课程编号:6.046J/18.410J 授课教师:Prof.Erik ...

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

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

  8. 算法导论-9.3-3-快速排序-最坏时间O(nlgn)

    一.题目 假定元素的值不同,说明如何才能使快速排序在最坏情况下以O(nlgn)时间运行 二.思考 要改善最坏情况的下运行时间,就要从划分入手,保证即使是最坏情况,也要尽量均衡地划分. 因此,使用SEL ...

  9. MIT算法导论公开课第七讲哈希表

    哈希表又称散列表,其定义是根据一个哈希函数将集合S中的关键字映射到一个表中,这个表就称为哈希表,而这种方法就称为Hashing.从作用上来讲,构建哈希表的目的是把搜索的时间复杂度降低到O(1),考虑到 ...

最新文章

  1. ADODB.Connection 错误 '800a0e7a' 未找到提供程序。该程序可能未正确安装。解决办法...
  2. Asp.net MVC防止图片盗链的实现方法,通过自定义RouteHandler来操作
  3. oracle查看用户密码时间限制
  4. cutycapt(php截图工具)
  5. 全球唯一标识GUID
  6. java视窗_java-预览窗口(如Windows 7任务栏显示已打开的...
  7. jeecg 与 jeecg-p3有什么区别?
  8. HDU——2768 Cat vs. Dog
  9. 思考:日期类型的数据应该用什么样的具体形式存储到数据库?
  10. python serial_python_serial
  11. 数据结构中的头结点和头指针
  12. matlab画图不显示中文_[过时] [LaTeX 使用] 升级 macOS 10.15 后 ctex 文档不显示中文的临时方案...
  13. 数字图像处理-美图秀秀:大眼算法
  14. apkg格式怎么打开_干货:pdf转换器简单、好用,还能在线互转文件格式
  15. 计算机中MAX函数是求什么,MAX函数
  16. UTC时区表(.Net)
  17. html网页如何在手机上观看,电脑的html怎么在手机观看
  18. 【解决办法】CodeBlocks不能debug/不能启动debugger
  19. Ansible:遇到错误 sudo: /etc/sudoers is world writable\r\nsudo: no valid sudoers sources found, quitting
  20. 欢迎加入我们的前端技术交流群

热门文章

  1. 【如何求素数】试除法讲解
  2. android仿秒拍首页点击视频无缝播放器,Android 仿美拍,秒拍 ,视频封面选择.有图有真相....
  3. linux kernel --- dts的相关操作函数
  4. 论文阅读:(arXiv 2022)Loonie:Compressing COINs with Lo-constraints
  5. Grumble.js气泡形状的提示(Tooltip)控件
  6. Windows10关闭端口
  7. archlinux之manjaro之使用体验
  8. 0欧电阻在PCB板的作用
  9. win10系统在电源选项中限制cpu最大频率(更新后丢失“处理器电源管理“项)
  10. 关于“公司基因论”的争论,吴军观点没有错