其次,数据在各个桶之间的分布是比较均匀的。如果数据经过桶的划分之后,有些桶里的数据非常多,有些非常少,很不平均,那桶内数据排序的时间复杂度就不是常量级了。
桶排序比较适合用在外部排序中。所谓的外部排序就是数据存储在外部磁盘中,数据量比较大,内存有限,无法将数据全部加载到内存中。
比如说我们有 10GB 的数据,我们希望对这波数据进行排序,但是我们的内存有限,只有1G,没办法一次性把 10GB 的数据都加载到内存中。这个时候该怎么办呢?
我们可以先扫描一遍文件,看数据所处的数据范围。假设经过扫描之后我们得到,数据最小为1,最大为1000。我们将所有数据划分到 100 个桶里,第一个桶我们存储在 1 元到 10 元之内的数据,第二桶存储在 11 元到 20 元之内的数据,以此类推。每一个桶对应一个文件,并且按照数据范围的大小顺序编号命名(00,01,02…99)。
理想的情况下,如果数据均匀分布,那数据会被均匀划分到 100 个文件中,每个小文件中存储大约 100MB 的数据,我们就可以将这 100 个小文件依次放到内存中,用快排来排序。等所有文件都排好序之后,我们只需要按照文件编号,从小到大依次读取每个小文件中的数据,并将其写入到一个文件中。
不过呢,不均匀才是常态嘛,有可能某个区间的数据特别多,划分之后对应的文件就会很大,没法一次性读入内存。这又该怎么办呢?
针对这些划分之后还是比较大的文件,我们可以继续划分。
如果划分之后,数据还是太多,无法一次性读入内存,那就继续再划分,