桶排序

太累,有空再写文字描述把

def bucket_sort(array=[]):
    # 1.得到数列的最大值最小值,并算出差值d
    max_value = array[0]
    min_value = array[0]
    for i in range(1, len(array)):
        if array[i] > max_value:
            max_value = array[i]
        if array[i] < min_value:
            min_value = array[i]
    d = max_value - min_value
    # 2.初始化桶
    '''
    桶排序需要创建多个桶来协助排序
    每一个桶代表一个区间范围,里面可以承载一个或多个元素

    '''
    bucket_num = len(array) # 创建桶的数量等于原始数列的元素数量
    bucket_list = [] # 把所有的桶都保存再bucket_list 这个集合中,每个桶都是个列表
    for i in range(0, bucket_num):
        bucket_list.append([]) # 这个是数列再嵌套数列么
    # 3.遍历原始数组,将每个元素放入桶中
    for i in range(0, len(array)):
        # 桶的区间跨度为什么按这个来算;他会随着i变化而变化
        # /是整除在一定程度上可以算出来该整数的下标。最后一个桶中的元素一定不会重复,只有一个元素
        num = int((array[i] - min_value) * (bucket_num-1) / d) 
        bucket = bucket_list[num] # 以这个为间隔来让元素加入到相应这个间隔的桶中;所以有些桶可能为空
        bucket.append(array[i])
    # 4.对每个桶内部进行排序
    for i in range(0, len(bucket_list)):
        # sort方法采用了时间复杂度O(nlogn)的排序算法
        bucket_list[i].sort() 
    # 5.输出全部元素
    sorted_array = []
    for sub_list in bucket_list:
        for element in sub_list:
            sorted_array.append(element)
    return sorted_array


my_array = list([4.12, 6.421, 0.0023, 3.0, 2.123, 8.122, 4.12, 10.09])
print(bucket_sort(my_array))


posted @ 2021-09-27 20:28  索匣  阅读(26)  评论(0编辑  收藏  举报