桶排序(Bucket Sort)
桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法, 是将一个数据表分割成许多buckets,然后每个bucket各自排序,或用不同的排序算法,或者递归的使用bucket sort算法。也是典型的divide-and-conquer分而治之的策略。它是一个分布式的排序,介于MSD基数排序和LSD基数排序之间。
原理:
将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。
算法详细描述:
- 设置一个定量的数组当作空桶;
- 遍历输入数据,并且把数据一个一个放到对应的桶里去;
- 对每个不是空的桶进行排序;
- 从不是空的桶里把排好序的数据拼接起来。
动图演示:
代码实现:
def bucketSort(arr):
buckets = [0] * ((max(arr) - min(arr)) + 1)
for i in range(len(arr)):
buckets[arr[i] - min[arr]] += 1
res = []
for i in range(len(buckets)):
if buckets[i] != 0:
res += [i + min(arr)] * buckets[i]
return res
时间复杂度、空间复杂度及稳定性:
桶排序的平均时间复杂度为线性的O(N+C),其中C=N*(logN-logM)。如果相对于同样的N,桶数量M越大,其效率越高,最好的时间复杂度达到O(N)。当然桶排序的空间复杂度为O(N+M),如果输入数据非常庞大,而桶的数量也非常多,则空间代价无疑是昂贵的。此外,桶排序是稳定的。 [1]