排序算法-桶排序

一、桶排序

       它同样是一种线性时间的排序算法,它类似于计数排序所创建的统计数组,桶排序需要创建若干个桶来协助排序。

每一个桶(bucket)代表一个区间范围,里面可以承载一个或多个元素。

如果有一个非整数数列如: 4.5,0.84,3.25,2.18,0.5

 第1步,创建这些桶,并确定每一个桶的区间范围。

    需要建立多少个桶,如何确定桶的区间范围,有很多种不同的方式。我们这里创建的桶数量等于原始数列的元素数量,除最后一个桶只包含数列最大值外,前面各个桶的区间按照比例来确定。

区间跨度=(最大值-最小值)/(桶的数量-1)

第2步,遍历原始数列,把元素对号入座放入各个桶中。

 第3步,对每个桶内部的元素分别进行排序(只有第1个桶需要排序)。

 第4步,遍历所有的桶,输出所有元素。

def bucketSort(ll):
    # 1.得到数列的最大值,最小值
    max = ll[0]
    min = ll[0]
    for i in range(1, len(ll)):
        if ll[i] > max:
            max = ll[i]
        if ll[i] < min:
            min = ll[i]
    # 差值
    diff = max - min
    # print(diff)
    # 2.初始化桶
    bucket = []
    for i in range(len(ll)):
        bucket.append([]) #添加每个列表
    print(bucket)
    #3.遍历原数列,将每个元素放入桶中
    for i in range(len(ll)):
        #桶的索引
        num=int((ll[i]-min)*(len(ll)-1)/diff)
        #每个桶数列
        bt=bucket[num]
        # 将数据放入桶
        bt.append(ll[i])
        print(num,bt)

    #4.每个桶内部排序
    for i in range(len(bucket)):
        bucket[i].sort()
    print(bucket)

    #5.排序
    sort_list=[]
    #循环输出排序的元素
    for i in bucket:
        for j in i:
            sort_list.append(j)
    return sort_list


if __name__ == '__main__':
    ll=[4.5,0.84,3.25,2.18,0.5]
    print(ll)
    print(bucketSort(ll))

 

假设原始数列有n个元素,分成n个桶。

下面逐步来分析一下算法复杂度。

第1步,求数列最大值、最小值,运算量为n。

第2步,创建空桶,运算量为n。

第3步,把原始数列的元素分配到各个桶中,运算量为n。

第4步,在每个桶内部做排序,在元素分布相对均匀的情况下,所有桶的运算量之和为n。

第5步,输出排序数列,运算量为n。

因此,桶排序的总体时间复杂度为O (n)。 至于空间复杂度同样是O(n)。 

  总之,具有代表性的排序算法如下:

相关推荐

  1. 排序算法-排序

    2024-04-26 17:28:06       40 阅读
  2. 程序分享--排序算法--排序

    2024-04-26 17:28:06       46 阅读
  3. 常用算法-排序

    2024-04-26 17:28:06       52 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-26 17:28:06       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-26 17:28:06       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-26 17:28:06       82 阅读
  4. Python语言-面向对象

    2024-04-26 17:28:06       91 阅读

热门阅读

  1. Uniapp 跨页面传复杂参、传对象

    2024-04-26 17:28:06       27 阅读
  2. pytorch与深度学习

    2024-04-26 17:28:06       35 阅读
  3. Dockerfile COPY、ADD 作用和区别

    2024-04-26 17:28:06       36 阅读
  4. elment ui 中el-input标签中@input初始化赋值触发问题

    2024-04-26 17:28:06       31 阅读
  5. C#开发-Null的整型数值比较

    2024-04-26 17:28:06       32 阅读
  6. 为什么程序开发中不推荐使用全局变量?

    2024-04-26 17:28:06       28 阅读
  7. 面试题总结第二弹

    2024-04-26 17:28:06       33 阅读
  8. Qt——QString 只保留数字

    2024-04-26 17:28:06       29 阅读