桶排序、计数排序和基数排序

什么是线性排序?

我们把时间复杂度为O(n)的排序算法,称为线性排序。意思是,排序时间和排序个数成正比。

桶排序

桶排序就是说,我把n个数,分为m个桶,每个桶里k个数,k = n/m。桶的大小顺序已经定义好了。然后把桶区间里的数字扔到桶里。最后进行桶内快速排序。

所以桶的时间复杂度是O(m*k*log(n/m)),又因为k = n/m,所以O(n*log(n/m))

所以当n无限接近于m的时候,log(n/m)是一个常量,所以桶排序的时间复杂度是O(n)

适用场景:最好是外部排序,就是数据存在外部磁盘中,数据量比较大,内存有限,不能将整个数据集读到内存中。

数据最好分布均匀,不然在极端情况下时间复杂度就会退化到快速排序的时间复杂度O(nlogn)。

数据要比较方便的分桶,桶与桶之间有天然的大小顺序。

计数排序

计数排序是桶排序的一种特例

我们以一个数据集为例,(2,5,3,0,2,3,0,3)。

最小值是0,最大值时5,我们建立一个大小为6的数组,然后依次将其对应的个数填上去。

其实根据个数,我们就可以很容易的还原出原理的数据集是(0,0,2,2,3,3,3,5)。

这就是计数排序

基数排序

基数排序是一种稳定排序算法。为什么要先这么说呢,因为这就是他算法内容之一。

以下图为例

猜你喜欢

转载自blog.csdn.net/lukeyyanghang/article/details/86625615