桶排序 (bucket sort)

桶排序 (bucket sort)

最好时间复杂度:O(n),
假设分了M个桶,每个桶内快排,那么总时间复杂度 O ( N ) + O ( M ∗ ( N / M ) ∗ log ⁡ ( N / M ) ) = O ( N ∗ ( log ⁡ ( N / M ) + 1 ) ) \mathrm{O}(\mathrm{N})+\mathrm{O}\left(\mathrm{M}^{*}(\mathrm{N} / \mathrm{M}) * \log (\mathrm{N} / \mathrm{M})\right)=\mathrm{O}\left(\mathrm{N}^{*}(\log (\mathrm{N} / \mathrm{M})+1)\right) O(N)+O(M(N/M)log(N/M))=O(N(log(N/M)+1)), 当M = N即均匀分布时,最小值为 O ( n ) O(n) O(n)

空间复杂度: O ( n + m ) O(n+m) O(n+m),其中m为桶的数量

稳定性:稳定,如果桶内排序采用其他不稳定的算法,那么就会不稳定。

基本形式:

桶排序,也叫箱排序,其工作原理是将数组分到有限量的桶里,每个桶在分别排序(有可能再使用别的排序算法或以递归方式继续使用桶排序进行排序),最后将各个桶中的数据有序地合并起来。

桶排序过程:

  1. 假设待排序的一组数均匀分布在一个范围内,并将这些数划分为多个子范围—桶,即要设置空桶数。
  2. 将待排序的数分别归入到对应的桶中(通过函数映射,映射函数得保证桶与桶之间是有序的),并将桶中的数据进行排序。
  3. 将不为空的桶中的数据有序地合并起来。

适用范围:

适用于小范围,均匀分布的整数数据,可以计算的数据量很大,且符合线性期望时间。

    def bucket_sort(array, bucket_num):
        maxer, miner = max(array), min(array)
        # 注意这里要+1
        bucket_size = (maxer - miner + 1) / bucket_num
        bucket = [[] for _ in  range(bucket_num)]
        print(bucket)
        for num in array:
            bucket[int((num-miner)/bucket_size)].append(num)
        result = []
        for i in range(len(bucket)):
            result += sorted(bucket[i])
        return result

其他

gap一般取ceiling( max - min / (len(array) -1))

你可能感兴趣的:(算法与数据结构)