0
点赞
收藏
分享

微信扫一扫

桶排序及代码实现

九点韶留学 2022-03-31 阅读 50

桶排序是一种用到了哈希表的排序方法。哈希表查找的方法是用取余做哈希函数,排序用取整做函数。

桶排序是计数排序的升级版,计数排序的索引是这个数字出现的次数,而桶排序则更加灵活,索引可以由哈希函数任意设置你想要的样子,哈希函数的设计是决定桶排序是否高效的前提。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。为了使桶排序更加高效,我们需要做到这两点:

  1. 在额外空间充足的情况下,尽量增大桶的数量
  2. 使用的映射函数能够将输入的 N 个数据均匀的分配到 K 个桶中

同时,对于桶中元素的排序,选择何种比较排序算法对于性能的影响至关重要。

在下面这个例子中,桶,或者说哈希函数,是按照数字的取整设置的,例如3和9对十取整都是0,则放到索引为0的桶里。放好元素之后再按照您喜欢的排序方法对桶里的数字排序,我选择了希尔排序,对每一个桶都排一遍,排好之后所有桶内的数字是有序的,而桶的索引也是从小到大的,这样只需要依次将所有桶内的数字放进新数组,就完成了排序。

在这里插入图片描述

Python实现:

def bucketSort(arr):
    l = len(arr)
    if l <= 1:
        return

    size = 10
    buckets = [[None] for i in range(size)]
    for v in arr:
        hashV = hash_func(v, size)
        if buckets[hashV] == [None]:
            buckets[hashV] = [v]
        else:
            buckets[hashV].append(v)

    for bucket in buckets:
        if bucket != [None]:
            shellSort(bucket)

    newarr = []
    for bucket in buckets:
        if bucket != [None]:
            newarr.extend(bucket)
    return newarr

# 哈希函数
def hash_func(x, size):
    return x//size

# 希尔排序
def shellSort(arr):
    l = len(arr)
    if l<=1:
        return
    interVal = l//2
    while interVal >= 1:
        for i in range(l-interVal):
            begin,end = i, i+interVal
            if arr[begin]>arr[end]:
                arr[begin], arr[end] = arr[end], arr[begin]
        interVal //= 2


arr = [47, 29, 78, 99, 71, 79, 24, 33]
res = bucketSort(arr)
print(res)
举报

相关推荐

0 条评论