算法:Distribute sort
站内链接:
- 算法(1)-检索-简介
- 算法(2)-检索-散列检索
- 算法(3)-检索-顺序检索
- 算法(4)-检索-树检索
- 算法(5)-排序-简介
- 算法(6)-排序-分配排序
- 算法(7)-排序-插入排序
- 算法(8)-排序-选择排序
- 算法(9)-排序-交换排序
- 算法(10)-排序-外排序
Introduction
分配排序基本思想: 排序过程无须比较关键字, 通过用额外的空间来分配和收集来实现排序, 这是一种以空间换时间的排序算法, 一般时间复杂度都是 O(n). 所以, 一般分配排序都是用于小规模或者分类数量极少, 重合度非常之高的数据排序中, 在对时间性能要求非常之高, 对空间要求低的应用场景中.
分配排序就是类似分布式的思维, 对数据的分配, 分布, 进行一种归纳整合, 最终在进行下一步的操作, 具体见排序算法. 排序算法分类如下:
- 桶排序: 将数组分到有限数量的桶子里,然后对每个桶子再分别排序
- 基数排序: 将整数按位数切割成不同的数字, 然后按每个位数分别比较
- 索引排序: 根据索引来表示数据的交换, 并非一定在分配排序中使用.
桶排序
Analysis
本质上,这是一种非比较类-线性时间-分配类-排序, 桶本身就已经是具备顺序的一个个集合, 物以类聚、人以群分,社会分层始终存在,左与右的选择.
缺点:浪费空间,桶的数量
关键字:分配到各个桶、收集各个桶的信息
- 设置一个定量的数组当作空桶子, 当然必须有一套提前预定的规则, 这样才能知道桶数量
- 遍历数组, 将元素按照规则放入桶中, 数据的分配和整合
- 对每一个非空的桶进行其他排序
- 合并非空桶
性能分析
时间复杂度: O(n + k)
空间复杂度: 最坏-O(n^2), O(n*k)
Example
1 | def bucketSort(list1, bucket_num): |
基数排序
Analysis
本质上,一种非比较类-线性时间-分配类-排序. 将整数按位数切割成不同的数字,然后按每个位数分别比较. 算法相关术语:
- 分量-d:所需进行桶排序的数量,每一次的基数都不一样的
- 单关键字:例如十进制整数,d 的值为最长位数,每次的基数都是 10
- 多关键字:例如扑克牌花色,d 的值为花色取值、点数,每次的基数不一样
算法过程:
- NB 公司求职?好几个备胎人选?还有好几关面试?
- 保证每一次的桶排序,大哥我都在优先队列
- 此轮排序的基数都是在前一轮排序的基础上的,技术第一嘛,OK
排序方式:
- LSD:低位优先排序
- MSD:高位优先排序
性能分析
时间复杂度: O(n), O(kn)
空间复杂度: O(n + k)
但是使用范围小
Example
1 | def radixSort(list1, radix): |
索引指针排序
Analysis
元素的数量或者数据量巨大等原因, 不希望频繁的移动要排序的元素, 故而维持一个索引指针数组来表示数据的迁移, 排序的过程就是下标移动的过程.该排序思维并非一种排序思想, 仅仅是一种排序的解决手段, 它可以再所有排序算法中使用. 算法好处:
- 避免扰乱要排序的数据
- 避免移动整个记录
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 狂想写作本!
评论