#https://github.com/paulnegz/sorts-py/blob/main/sort.py
from functools import wraps, reduce
def bucket_sort(array :list)->list:
BUCKET_SIZE = ceil(len(array)**(3/4))
min_val, max_val = min(array), max(array)
RANGE = (max_val-min_val+1)/BUCKET_SIZE
bucket = [[] for _ in range(BUCKET_SIZE)]
get_idx = lambda num: int((num-min_val)/RANGE)
for num in array: bucket[get_idx(num)].append(num)
for x in bucket: _insertion_sort(x)
flat_map = lambda arr: reduce(lambda acc, curr: [*acc,*curr], arr)
return flat_map(bucket)
arr = [7, 2, 4, 0, 1, 5, 8, 3, 2, 0]
print(bucket_sort(arr)) # [0, 0, 1, 2, 2, 3, 4, 5, 7, 8]