一、桶排序(Bucket sort)

1、原理

将要排序的数据分到几个有序的桶里,每个桶里的数据再进行排序。桶内的数据排序完毕之后,再把桶里的数据依次取出,组成的序列就是有序的了。

2、原地排序?

属于原地排序算法。主要看桶内排序是否时原地排序算法,若选择插入排序,则桶排序就是属于原地排序,若选择了快速排序,则不属于原地排序。

3、稳定性算法?

不属于稳定性排序算法。因为根据我的代码实现,桶内数据会申请内存,故空间复杂度为O(n)。

4、时间复杂度

(1)最好情况

桶数量很多,并且数据均匀分布在各个桶内。

假设要排序的数据数量为 n,分配的桶的个数为 m,那么每个桶中的数据的数量为 k = n / m 。桶内采用快速排序算法,根据之前的推到,快排的时间复杂度为O(nlogn),准确说应该是

C是常数。将 k 代入公式中,得到每个桶的排序时间为

将 k 的计算公式带入上述公式中,得到如下

m 个桶一共需要的时间为

当 m 接近于 n 时,上述公式就变为如下

所以时间复杂度为 O(n) 。

(2)最坏情况

数据只分配到了一个桶,算法退化成快排,时间复杂度为 O(nlogn) 。

5、数据要求

  • 要排序的数据要轻松地划分成 m 个桶,并且桶与桶之间要有天然的大小顺序。
  • 数据在各个桶内的分布是均匀的。

6、适用场景:外部排序(数据保存在外部磁盘中,数据量比较大,内存有限,无法将数据全部加载到内存中)

假设有10G的订单数据,如何按照订单金额从小到大进行排序?

步骤如下:

  • 扫描一遍订单,确定金额的最小值和最大值,假设分别为 1 和 10k 。
  • 将订单金额分成100个桶,编号分别为 01,02,03,……,那么第 1 个桶内的金额为 1 ~ 1000,第 2 个桶内的金额为 1001 ~ 2000,……
  • 每个桶内的数据大概为100M,加载到内存中进行快排是没有问题的,将排序结果按照桶编号依次存入一个固定文件中,那么该文件中最后显示的结果就是最终的排序结果。

二、计数排序(Counting sort)

1、原理

当要排序的数据 n 非常大时,而数据所处的范围又较小,比如最小值和最大值分别为 1 和 k ,那么可以把数据分成 k 个桶,每个桶内的数据都是相同的,从而节省了桶内的排序时间。

实际上计数排序是桶排序一种特殊情况,即:对于桶排序,每个桶内的数据需要进行排序,而计数排序的桶内数据都是相同的,不需要排序。

2、原地排序?

不属于原地排序算法。根据代码的实现原理,需要使用计数数组,所以空间复杂度为 O(n) 。

3、稳定性算法?

属于稳定性排序算法。因为在将数据放入桶中时,保持原有数据顺序,再复原时按照顺序复原可以。

4、时间复杂度

根据算法的实现原理,只需要遍历一遍数据即可,时间复杂度为 O(n) 。

5、应用栗子

如何将某省100万的考生的高考成绩从小到大排序?

分数范围为 0 ~ 900,每一分都有大量考生重合。可以将分数分成 901 个桶,桶内的分数都是相同,只需要遍历数据, 将数据放入各个桶内即可。

6、适用范围

  • 数据范围不大,即:数据量要远大于数据范围。
  • 数据只能给非负整数进行排序

三、基数排序(Radix sort)

1、原理

将待排序的数列中的数拆分成“位”(十进制),对每一位进行稳定性排序(例如计数排序),直到所有的位都排序完成。

2、原地排序?

不属于原地排序算法。因为各个位排序时使用了线性排序算法。

3、稳定性排序?

属于稳定性排序。因为针对每一位的操作实际上都是稳定性排序,保证了相同数据的前后位置。

4、时间复杂度

因为对每一位的排序采用计数排序,时间复杂度为 O(n),假设最大的数据所在的位(十进制)总数为 k,则时间复杂度为O(kn),总体来说时间复杂度约等于 O(n) 。

5、应用栗子

如何对 10 万个手机号码你进行从小到大排序?

这里可以采用基数排序算法,将所有的手机号码拆成11个数字,从后向前一次进行计数排序,因为计数排序属于稳定性 性算法,这就保证了最终的排序结果是正确的。

6、适用范围

  • 可以将待排序的数据拆成“位”来比较,“位”与“位”之间存在递进关系。
  • 每一位的数据范围不能太大,这样可以使用线性排序算法来排序,例如计数排序。

四、总结

1、性质

算法种类 时间复杂度 空间复杂度 原地排序 稳定性排序
桶排序 O(n) O(n) × ×
计数排序 O(n) O(n) × ×
基数排序 O(n) O(n) × ×

2、源代码

Github

参考:极客时间《数据结构与算法之美》王争

这门课真心推荐,内容很经典、栗子很形象,里面还包含了很多面试题目。真是居家旅行必备良药。

(SAW:Game Over!)

数据结构与算法 / 排序算法(3)相关推荐

  1. Java数据结构第一讲-排序算法

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

  2. [ 数据结构 -- 手撕排序算法第三篇 ] 希尔排序

    手撕排序算法系列之:希尔排序. 从本篇文章开始,我会介绍并分析常见的几种排序,大致包括插入排序,冒泡排序,希尔排序,选择排序,堆排序,快速排序,归并排序等. 大家可以点击此链接阅读其他排序算法:排序算 ...

  3. 数据结构与算法 / 排序算法 / 堆排序

    一.定义 借助堆结构实现的排序算法被称为堆排序. 二.过程说明 1.建堆 (1)方法1 原地建堆,对于数组来说,从前往后:对于树来说,从下向上. 将数组的第一个元素作为堆顶,第二个元素做向堆中插入数据 ...

  4. 值得收藏的时间复杂度速查表:数据结构操作、排序算法、图操作、堆操作

    时间复杂度速查表 这篇文章覆盖了计算机科学里面常见算法的时间和空间的大 OBig-O 复杂度. 在参加面试前,我们经常需要花费很多时间从互联网上查找各种搜索和排序算法的优劣,了节省大家的时间,我收集了 ...

  5. 数据结构-常用的排序算法

    总第123篇 好久不见哈,我终于又更新了,惊不惊喜,意不意外,哈哈哈哈.等之后会专门写一篇文章给大家汇报汇报我最近在忙什么呢,今天这篇还是接着之前的数据结构系列继续,主要讲讲数据结构里面常用的几种排序 ...

  6. 数据结构的六大排序算法详解

    文章目录 一.简单排序 1.Comparable接口介绍 2.冒泡排序 3.选择排序 4.插入排序 二.高级排序 1.希尔排序 2.归并排序 3.快速排序 4.排序的稳定性 一.简单排序 在我们的程序 ...

  7. 数据结构基础和排序算法

    数据结构和算法 1. 数据结构 1.1 稀疏数组 这个简单 稀疏数组即二维数组中有大量为0或同一个无效值的时候,将其压缩为只有有效数据的稀疏数组,需要使用时将其读写出来转为二维数组. public c ...

  8. 数据结构进阶 八大排序算法详解

    数据结构就是定义出某种结构:像数组结构.链表结构.树形结构等,实现数据结构就是我们主动去管理增删查改的实现函数 排序的概念 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列 ...

  9. 数据结构和常用排序算法复杂度

    1.顺序表 插入操作时间复杂度 最好O(1),最坏O(n),平均O(n) 移动结点的平均次数n/2 删除操作时间复杂度 最好O(1),最坏O(n),平均O(n) 移动结点的平均次数(n-1)/2 按值 ...

最新文章

  1. Edraw Max(亿图图示)案例:产品经理如何用亿图绘制流程图?
  2. python executemany
  3. android画廊效果的轮播图,轮播图(3d画廊效果)
  4. 面试常考!缓存三大问题及解决方案
  5. kafka安装_安装Kafka
  6. 个人作业——福大微信公众号使用评测
  7. Shell入门(二)之变量
  8. 文章之间的基本总结Activity生命周期
  9. Hibernate---简介
  10. mipi和isp处理_汽车摄像头的图像信号处理ISP NVP2650
  11. ffmpeg批量转换ts为mp4
  12. 电子邮件格式详细介绍
  13. 坚果云和百度网盘的比较
  14. MTK led闪烁改为呼吸灯模式
  15. 18 - java基初 数组介绍 冒泡排序
  16. 百度网盘限速下载,PanDownload简直逆天
  17. 小乌龟提交本地的文件夹下多个项目
  18. 09最新XP系统大全(可下载)
  19. 国内PLM用户满意度调研完整版
  20. c语言关键字中英翻译机课程设计,课程设计--C语言关键字中英翻译机.doc

热门文章

  1. 浅谈HTTP事务的一个过程
  2. 【自己动手写神经网络】小白入门连载(二)--机器人时代必须得有人工神经(不是神经病)...
  3. 数据中心的企业正羽科技技术收购虚拟主机VantiCore
  4. 【java实训课】工程项目文件(IDEA+MYSQL)
  5. 内核函数 系统调用 系统命令 库函数
  6. go goroutine主死从随
  7. docker-compose部署nginx,挂载外置配置文件及项目
  8. containerd设置上网代理
  9. 【收藏】webpack configuration.module has an unknown property ‘loaders‘. These properties arevalid: 解决办法
  10. Scala基于Akka模拟Spark Master Worker进程间通信(二):Worker定时向Master心跳