线性排序之桶排序

桶排序,顾名思义,会用到“桶”,核心思想是将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行排序。桶内排完序之后,再把每个桶里的数据按照顺序依次取出,组成的序列就是有序的了。

# 桶排序 适合处理数据量大但数值范围分布均匀的数据,适合外部排序

from typing import List
class BucketSort(object):
    @staticmethod
    def bucketSort(arr:List[int], bucketSize: int): 
        if len(arr) <= 1:
            return
        
        # 找出最大最小值
        minValue = arr[0]
        maxValue = arr[len(arr) - 1]
        for i in (arr):
            if i < minValue:
                minValue = i
            elif i > maxValue:
                maxValue = i
        
        # 桶数量
        bucketCount = (maxValue - minValue) // bucketSize + 1
        # buckets = [[None for col in range(bucketSize)] for row in range(bucketCount)]
        buckets = [[] for row in range(bucketCount)]

        # 记录每个桶存入的元素数量
        indexArr = [0 for x in range(bucketCount)] 

        # 将数组值均匀的分到各个桶内
        for i in range(len(arr)):
            bucketIndex = (arr[i] - minValue) // bucketSize
            # 数组满了要扩容
            # if indexArr[bucketIndex] == len(buckets[bucketIndex]):
            #     pass
            buckets[bucketIndex].append(arr[i])
            indexArr[bucketIndex] += 1
        
        # 对每个桶进行排序,一般用快速排序
        k = 0
        for subArr in buckets:
            l = len(subArr)
            if l == 0:
                continue
            BucketSort.quickSortC(subArr, 0, l - 1)
            arr[k:(k + l)] = subArr[0:l]
            k = k + l

    # 快排递归函数
    @staticmethod
    def quickSortC(arr, low, high):
        if low >= high:
            return
        
        mid = BucketSort.partition(arr, low, high)
        BucketSort.quickSortC(arr, low, mid-1)
        BucketSort.quickSortC(arr, mid+1, high)
    
    # 快排分区函数
    @staticmethod
    def partition(arr, low, high):
        pivot = arr[high]
        i = low
        for j in range(low, high):
            if arr[j] < pivot:
                arr[i], arr[j] = arr[j], arr[i]
                i += 1
        # swap
        arr[i], arr[high] = arr[high], arr[i]
        return i
       
if __name__ == "__main__":
    arr = [1,2,3,4,2,4,3,6,8,10,2,3,5,7,3,4,6,8,9]
    print(arr)
    BucketSort.bucketSort(arr, 5)
    print(arr)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值