您的位置:首页 > 理论基础 > 数据结构算法

常用数据结构之桶式排序

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个桶,这显然是不合适的。

 

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐