当前位置:首页python > 正文

python写的桶排序动态演示程序

作者:野牛程序员:2023-03-01 20:31:37python阅读 2561

桶排序是一种非常高效的排序算法,特别适合在已知数据范围的情况下使用


python写的桶排序动态演示程序

import time
import random
import matplotlib.pyplot as plt


def bucket_sort(arr):
    """
    桶排序
    :param arr: 待排序的数组
    :return: 排序后的数组
    """
    max_num = max(arr)
    min_num = min(arr)
    bucket_range = (max_num - min_num) / len(arr)
    bucket_list = [[] for _ in range(len(arr)+1)]  # 初始化桶
    color_map = plt.cm.get_cmap('rainbow', len(bucket_list))

    # 将元素放入对应的桶中
    for i in range(len(arr)):
        bucket_index = int((arr[i] - min_num) // bucket_range)
        bucket_list[bucket_index].append(arr[i])
        draw_buckets(bucket_list)  # 绘制桶状态
        time.sleep(0.1)

    # 对每个桶中的元素进行排序
    for i, bucket in enumerate(bucket_list):
        bucket_list[i] = sorted(bucket)
        draw_buckets(bucket_list)  # 绘制桶状态
        time.sleep(0.1)

    # 将所有桶中的元素按顺序放回原数组
    arr_index = 0
    for bucket in bucket_list:
        for item in bucket:
            arr[arr_index] = item
            arr_index += 1
            draw_buckets(bucket_list)  # 绘制桶状态
            time.sleep(0.1)

    return arr
def draw_buckets(bucket_list):
    """
    绘制桶状态
    :param bucket_list: 桶列表
    """
    plt.clf()
    plt.title("Tel:15892516892 ->Bucket Sort")
    color_dict = {0: 'r', 1: 'g', 2: 'b', 3: 'c', 4: 'm', 5: 'y', 6: 'k'}
    for i in range(len(bucket_list)):
        color = color_dict.get(i, 'b')
        plt.bar(i, len(bucket_list[i]), color=color)
        for j in range(len(bucket_list[i])):
            plt.text(i, j + 0.5, str(bucket_list[i][j]), color="w", ha="center", va="center")
    plt.xlim(-1, len(bucket_list))
    plt.ylim(0, len(max(bucket_list, key=len)))
    plt.xticks(range(len(bucket_list)), [str(i) for i in range(len(bucket_list))])
    plt.yticks([])
    plt.pause(3)





if __name__ == '__main__':
    # 生成随机数组并绘制初始状态
    arr = [random.randint(1, 100) for _ in range(15)]
    draw_buckets([arr])

    # 进行桶排序并绘制最终状态
    arr = bucket_sort(arr)
    draw_buckets([arr])

    # 显示绘图窗口
    plt.show()
野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击