漫谈排序算法——桶排序

106 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第13天,点击查看活动详情

前言

在前面几篇文章中,我们谈到了常用的几种排序的原理,今天我们就来看一下一种比较特殊的排序算法桶排序,它的排序的时间复杂度是线性的,所以桶排序算法的话又可以称为线性排序(Linear sort)。因为桶排序是非基于比较的排序算法,不涉及元素之间的比较操作的。

桶排序(Bucket sort)的原理

我们来看一下桶排序的定义,它的核心思想就是将排序的数据分到几个有序的桶中,然后再对每个桶里的数据单独的进行排序,桶中的数据排序完成之后,按照桶的顺序,将桶里的数据依次取出,组成的序列就是有序的。那么为什么桶排序的时间复杂度会是O(n)呢?如果我们要排序的数据有n个,将它们均匀的分布在m个桶中,这样我们就得到每个桶中会有k=n/m个元素,然后对每个桶进行快速排序,由此得到时间复杂度为O(k * logk),m个桶的时间复杂度为O(m * k * logk),因为k=n/m,由此可以得到桶排序的时间复杂度为O(n * log(n/m))。当n和m的值非常接近,整个桶桶排序的时间复杂度接近 O(n)。但是要达到这个时间复杂度,是需要一些特定场景的,比如排序的数据需要可以容易的划分为m个桶,桶之间存在着天然的大小顺序的。这样桶内的数据排序完成之后,桶之间就不需要进行排序了。第二点就是桶之间的需要分布均匀的。因为有些数据经过划分之后,会表现出某些桶的数据量特别多,某些桶的数量特别少。这样就不再是O(n)的时间复杂度了。

总结

桶排序算法是基于经典算法下的,一个特定场景的排序算法的。