桶排序及代码实现

本文介绍了桶排序算法,它是计数排序的升级版,利用哈希函数将数据分配到不同桶中进行排序。关键在于设计合适的哈希函数以确保数据均匀分布,以及桶内元素使用希尔排序进行排序。通过Python代码展示了如何实现桶排序,适用于已知数据范围且分布较为均匀的情况。
摘要由CSDN通过智能技术生成

排序算法总结:

  1. 快速排序
  2. 堆排序
  3. 选择排序
  4. 希尔排序
  5. 冒泡排序
  6. 计数排序
  7. 桶排序
  8. 基数排序
  9. 插入排序
  10. 归并排序

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

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

  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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值