• 备战蓝桥杯Day23-桶排序


    桶排序

    计数排序的基础上,如果元素的范围较大(比如在1-1亿之间),如何改造算法?

    那么就引出桶排序(Bucket Sort):首先将数据分为不同的桶,再把元素放到相应的桶中,再对桶中的元素进行排序。

    排序思路

    1. 分桶: 将待排序数据根据某种规则分配到不同的桶中。可以根据数值范围、数据的某个特征等来确定分桶规则。

    2. 桶内排序: 对每个桶内的数据进行排序。可以使用任何适合的排序算法,通常是插入排序或者快速排序。

    3. 合并: 将所有桶的结果按顺序合并,即可得到最终有序序列。

    代码实现 

    1. def bucket_sort(li, n=100, max_num=10000):
    2. buckets = [[] for _ in range(n)]
    3. for var in li:
    4. i = min(var//(max_num//n), n-1) # 下面有详细注释
    5. buckets[i].append(var) # 把var放到桶里
    6. # 保持桶内的顺序
    7. for j in range(len(buckets[i])-1, 0, -1):
    8. if buckets[i][j] < buckets[i][j-1]:
    9. buckets[i][j], buckets[i][j-1] = buckets[i][j-1], buckets[i][j]
    10. else:
    11. break
    12. # 新建一个列表,把数据放进去
    13. sorted_li = []
    14. for buc in buckets:
    15. sorted_li.extend(buc)
    16. return sorted_li
    17. # 测试案例
    18. import random
    19. li = [random.randint(0,10000) for i in range(1, 1000000)]
    20. li = bucket_sort(li)
    21. print(li)

     一些注释

     i = min(var//(max_num//n), n-1)

    n:有几个桶

    max_num:数据元素的总个数

    max_num // n:每个桶里有几个数

    var // (max_num // n):把循环遍历到的数var应该放到哪个桶里

    min(var // (max_num // n))遍历到最后一个数时,桶会出现越界的情况,为了避免这种情况,我们总是与n-1比较并取最小值,这样不会出现越界的情况。

    数据非常大跑代码会有点慢,耐心等待一下~

    运行结果

    只截取了开头结尾,数据太多了没截全。

     

  • 相关阅读:
    公共政策学考试题库
    SpringBoot实现发送验证码功能
    MySQL面试题入门:四大范式、SQL生命周期、SQL六大语言、索引、最左匹配原则....
    1.2-断言
    【GUI】Python图形界面(三)
    数组元素全排列Java
    Android14 WMS-IWindow介绍
    ElasticSearch from + size 分页查询过程分析,及其官方ES深度分页性能优化方法
    Redis 数据迁移篇之redis-shake工具使用手册
    android的Framework
  • 原文地址:https://blog.csdn.net/2301_78820199/article/details/136436805