常用数据结构之桶式排序
2019-05-05 19:40
267 查看
关于桶式排序,其实以前见到过,当成了一个排序技巧来记了。具体就是,有一个序列,有n个数,并且每个数取值范围是0~100。问如何快速的进行排序。那么我们可以很容易想到,就是在开一个大小为一百的数组,并且初始化为0,然后遍历所给的序列,比如遍历到了23,就把23放入新开数组下标为23的位置上,具体表现在加1,这样最后在重新遍历新开的数组,当元素不为0时输出下标,这样序列就从小到大排好了。
其当然有一些弊端,就是数据范围问题。当序列中有一个数值是100000,那就得开一个很大的数组,显然,这个算法还可以优化。那就是我们可以采用多趟排序。其也称为多关键字排序,称为基数排序。下面举例说明。如果一段序列,为203,1,23,234,9
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
第一趟 | 1 |
203 23 |
234 | 9 | ||||||
第二趟 |
9 203 1
|
23 | 234 | |||||||
第三趟 |
23 9 1
|
234 203
|
排列的最后结果为:1,9,23,203,234。
应尤为注意的是,每个桶内的数字都是有着严格的顺序的,它们遵从先进先出的原则!第一趟是按个位进行入相应的桶,第二趟是根据十位进行依次入桶,第三趟是根据百位进行入桶。
下面分析其算法的时间复杂度:其最好最坏的情况都是O(d*(n+rd))。其中d是进行的趟数,n是序列中元素的个数,rd是桶数,如本个例子是桶数为10。如何理解呢,因为每一趟,我们都需要遍历n个关键字进行入桶。之后再进行第二次入桶时,我们需要遍历每一个桶进行收集。所以其时间复杂度是如此。
关于其空间复杂度:是O(rd)。
这个很好理解,因为每个桶就是一个队列,需要头尾指针,所以需要的空间为,O(2*rd),化简后就是O(rd)。
总结:基数排序是适用于关键字较多,而关键字的基数较少。如果按26个字母来排,就需要26个桶,这显然是不合适的。
相关文章推荐
- 【数据结构】常用比较排序算法(包括:选择排序,堆排序,冒泡排序,选择排序,快速排序,归并排序)
- 数据结构和算法分析之排序篇--归并排序(Merge Sort)和常用排序算法时间复杂度比较(附赠记忆方法)
- 数据结构-排序算法详解(插入排序,希尔排序,堆排序,归并排序,快速排序,桶式排序)
- 一步步学习数据结构和算法之常用排序效率分析及java实现
- 算法与数据结构-常用排序算法总结1-比较排序
- 数据结构 c语言设计队列 实现桶式排序和基数排序 测试性能
- 常用排序的实现方法(数据结构)
- 常用数据结构_排序_查找练习
- 数据结构的常用排序和稳定性分析
- 【数据结构】常用比较排序算法(包括:选择排序,堆排序,冒泡排序,选择排序,快速排序,归并排序)
- 【郝斌数据结构自学笔记】75-78_链式二叉树遍历具体程序演示_5种常用排序概述和快速排序详细讲解_再次讨论什么是数据结构_再次讨论到底什么是泛型
- 数据结构常用排序(java)
- EKAlgorithms-常用数据结构Objective-C语言实现一数组排序
- 常用的算法和数据结构分析(查找和排序)
- 【算法与数据结构必备】PHP常用排序算法:冒泡,快速排序,插入排序(一维数组)
- (啊哈!算法)(第一章)最常用排序——快速排序
- Oracle排序中NULL值处理的五种常用方法
- 数据结构复习 快速排序个人总结
- GLIB 常用数据结构介绍 4
- 四个常用且重要的数据结构