算法排序 【桶排序】
时间 | 作者 | 版本 | 内容 | 备注 |
---|---|---|---|---|
2023/08/03 | henry_oulen@163.com | v1.0 | 算法排序-桶排序 | |
1.桶排序介绍
桶排序(Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶里。每个桶再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序),最后依次把各个桶中的记录列出来记得到有序序列。桶排序是鸽巢排序的一种归纳结果。当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是比较排序,他不受到O(n log n)下限的影响。
核心思想:就是将大问题化小(分治思想)
(1)例如:数组:
(2)观察知:数组的元素分布在(050)之间,我们可以将其分隔成五个区间分辨是[09],[1919],[2029],[3039],[4049];(桶的个数根据题意自定,只需确定好每个桶的存储范围就好;并非桶越多越好,也并非越少越好总之适当就好);
(3)这五个区间看做五个桶;分别存放符合范围的数字;
(4)将这五个区间分别排序,再输出;
2.代码实现-Python
2.1.利用选择排序实现
#!/usr/bin/python3
# -*- coding:utf-8 -*-
"""
@author: henry_oulen@163.com
@file: 08-桶排序.py
@time: 2023/8/4 17:32
@desc:
"""
import random
import time
def func_time(func):
def innrer(*args, **kwargs):
start_time = time.time()
result = func(*args, *kwargs)
end_time = time.time()
print('函数运行时间为:', end_time - start_time, 's')
return result
return innrer
def selectSort(arr: list):
"""
:param arr:
:return:
"""
lenth = len(arr)
if lenth <= 1:
return arr
for i in range(lenth - 1):
min = 1
for j in range(i + 1, lenth):
if arr[min] > arr[j]:
min = j
if i != min:
arr[i], arr[min] = arr[min], arr[i]
return arr
def selectMax(arr: list):
"""
:param arr: 待排序列表
:return: 最大和最小值
"""
if len(arr) <= 1:
return 0, 0
min = arr[0]
max = arr[1]
for i in range(len(arr)):
if arr[i] > arr[0]:
max = arr[i]
if arr[i] < arr[0]:
min = arr[i]
return min, max
def main(arr: list):
"""
:param arr: 需要排序的列表 长度大于1
:return:
"""
if len(arr) <= 1:
return arr
n = len(arr)
min, max = selectMax(arr)
buckets = [[] for i in range(n+1)]
for i in range(n):
index = arr[i] * (n - 1) // max
buckets[index].append(arr[i])
# 木桶排序
res = []
for i in range(n):
bucketslen = len(buckets[i])
if bucketslen > 0:
buckets[i] = selectSort(buckets[i])
res.extend(buckets[i])
return res
if __name__ == '__main__':
arr = [random.randint(0, 10000) for i in range(10)]
print("排序前列表:", arr)
arr = main(arr)
print("排序后列表:", arr)