• 排序算法之桶排序


    一、原理

    桶排序是计数排序的升级版,如果计数排序中数的范围比较大呢?之前的计数排序数字范围是1-200,假如1-20000呢?利用桶排序就可以对其进行优化。

    步骤:

    (1)将元素分在不同的桶中

    (2)在对每一个桶中的元素进行排序

    桶排序的的快慢取决于数据的分布:

    • 当输入的数据可以均匀的分配到每一个桶中,排序最快
    • 当输入的数据被分配到了同一个桶中,排序最慢

    关键点:

    • 每一个桶中有多少个数
    • 每一个数应该放到哪一个桶中

    二、实现

    def binSort(li,min_num,max_num,bin_num=10):
        bin=[[] for i in range(bin_num)]#[ [],[],[],...  ]
    
        for num in li:
            n=(max_num-min_num+1)/bin_num #表示多少个数在一个桶里
            bin[int(num // n)].append(num) #对应的数字放在对应的桶里
    
            #维护桶有序,每一个桶使用插入排序,注意这是对每一个桶中的数进行排序
            i=len(bin[int(num // n)])-1 #i表示桶中的最后一个数
            tmp=bin[int(num // n)][i]
            j=i-1
            while j>=0 and tmp<bin[int(num // n)][j]:
                bin[int(num // n)][j+1]=bin[int(num//n)][j]
                j=j-1
            bin[int(num // n)][j+1]=tmp
      
      #对每一个桶中的数进行合并,返回已经排序好的序列 res
    =[] for l in bin: res.extend(l) return res import random li=[random.randint(0,600) for i in range(10000)] print(binSort(li,0,600))
  • 相关阅读:
    poj 3255
    (DP) bzoj 2091
    (最短路) bzoj 2118
    (点双联通分量) poj 2942
    (树直径) bzoj 1509
    (离线处理+BFS) poi Tales of seafaring
    (并查集+DFS) poi guilds
    (记忆话搜索)POI Fibonacci Representation
    (DP) POI Bytecomputer
    (DP) bzoj 1296
  • 原文地址:https://www.cnblogs.com/shenjianping/p/11109345.html
Copyright © 2020-2023  润新知