排序算法之桶排序

一、原理

桶排序是计数排序的升级版,如果计数排序中数的范围比较大呢?之前的计数排序数字范围是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))