设置固定数量的空桶;
把数据放到对应的桶中;
对每个不为空的桶中数据进行排序;
拼接不为空的桶中数据,得到结果。


def bucket_sort(lst):
    max_value = lst[0]
    min_value = lst[0]
    for m in lst:
        if m > max_value:
            max_value = m
        if m < min_value:
            min_value = m

    # 1. 创建桶(注意:一个桶就是一个列表)
    bucket_num = (max_value - min_value) // 3 + 1
    buckets = [[] for _ in range(bucket_num)]
    # 2. 将数据分桶 并在桶内并排序
    for k in lst:  # 遍历列表中所有的数
        i = k // 3  # i 表示 放到几号桶里
        buckets[i].append(k)  # 将数添加到桶里边
        # 桶内排序 这里是插入排序
        for j in range(len(buckets[i]) - 1, 0, -1):
            if buckets[i][j] < buckets[i][j - 1]:
                buckets[i][j], buckets[i][j - 1] = buckets[i][j - 1], buckets[i][j]
            else:
                break

    prev_length = 0
    for i in range(bucket_num):
        cur_length = len(buckets[i])
        for j in range(cur_length):
            lst[i * prev_length + j] = buckets[i][j]
        prev_length = cur_length

时间复杂度:
    最优:$O(n+k)$
    最坏:$O(n^2)$
    平均:$O(n+k)$
空间复杂度: $O(n + k)$
稳定性: 稳定