桶排序
订阅
桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是 比较排序,他不受到 O(n log n) 下限的影响。
展开全文

桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是 比较排序,他不受到 O(n log n) 下限的影响。
信息
- 领 域
- 计算机算法
- 要 求
- 数据的长度必须完全一样
- 公 式
- Data=rand()/10000+10000
- 原 理
- 桶排序利用函数的映射关系
- 中文名
- 桶排序
- 性 质
- 平均情况下桶排序以线性时间运行
- 数据结构设计
- 链表可以采用很多种方式实现
桶排序定义
假定:输入是由一个随机过程产生的[0, 1)区间上均匀分布的实数。将区间[0, 1)划分为n个大小相等的子区间(桶),每桶大小1/n:[0, 1/n), [1/n, 2/n), [2/n, 3/n),…,[k/n, (k+1)/n ),…将n个输入元素分配到这些桶中,对桶中元素进行排序,然后依次连接桶输入0 ≤A[1..n] <1辅助数组B[0..n-1]是一指针数组,指向桶(链表)。
-
桶排序
2020-09-02 22:13:35桶排序 桶排序(Bucket sort)或所谓的箱排序,是一种类似于计数排序所创建的统计数组的线性时间排序算法。桶排序需要创建若干个桶来协助排序。 原理:将数组分到有限个数量的桶子里。每个桶子再分别排序(有可能再...桶排序
桶排序(Bucket sort)或所谓的箱排序,是一种类似于计数排序所创建的统计数组的线性时间排序算法。桶排序需要创建若干个桶来协助排序。
原理:将数组分到有限个数量的桶子里。每个桶子再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间。但桶排序不是比较排序,它不受下限的影响。
桶排序中的每一个桶实际上代表着一个区间范围,里面可以承载一个或多个元素。假设有一个非整数数列如下:[4.5,0.5,3.5,2.2,0.8]
,下面来看下具体的实现:- 创建桶,并确定每一个桶的区间范围;具体需要建立多少个桶,如何确定桶区间范围,有多种方式可以实现,这里创建的桶数量等于原始数列的元素,除了最后一个桶只包含数列最大值外,前面的各个桶区间都按照比例来确定
- 遍历原始数列,把元素对号入座放入各个桶中。
- 对每个桶内部的元素分别进行排序
- 遍历所有桶,输出所有元素
代码实现
def BucketSort(arr): #得到最大值,最小值以及最大值最小值的差值 max_num = max(arr) min_num = min(arr) D_value = max_num - min_num #初始化桶 bucketNum = len(arr) - 1 #数列长度即为桶的数量 bucketSize = ((max_num - min_num) // bucketNum) #根据桶的数量找到每个桶的取值范围 buckets = [[] for i in range(bucketNum)] #创建bucketNum个桶 # 将原数组的元素放入每个桶中 for i in range(len(arr)): bucket_index = int((arr[i] - min_num) * bucketNum // D_value) buckets[bucket_index].append(arr[i]) result = [] #桶中元素排序 for unsorted_bucket in buckets: #插入排序 sorted_bucket = insert_sort(unsorted_bucket) result += sorted_bucket return result #插入排序 def insert_sort(arr): length = len(arr) #第一个元素默认已经排好序 for i in range(1,length): #如果前一个元素大于当前元素,交换位置 while i > 0 and arr[i-1] > arr[i]: arr[i-1],arr[i] = arr[i],arr[i-1] i -= 1 return arr if __name__ == "__main__": arr = [3,4,1.2,5.6,9,2.8,7] result = BucketSort(arr) print(result)
复杂度分析
- 时间复杂度:,第一步,求数列最大、最小值,运算量为;第二步,创建空桶,运算量为;第三步,把原始数列的元素分配到各个桶中,运算量为;第四步,在每个桶内部做排序,在元素分布相对均匀的情况下,所有桶的运算量之和为,第五步,输出排序好的数列,运算量为。因此,桶排序的总体时间复杂度为。
- 空间复杂度:。
注意:桶排序适用于数据元素分布比较均匀的情况,如果元素分布极不均匀,会导致绝大多数元素都分在了一个桶里,其余的桶就白白创建了。这种情况下,时间复杂度在一定程度上是会增加的。这也验证了一点,没有绝对好的算法,当然也没有绝对不好的算法,关键是要看具体的使用场景。
- 创建桶,并确定每一个桶的区间范围;具体需要建立多少个桶,如何确定桶区间范围,有多种方式可以实现,这里创建的桶数量等于原始数列的元素,除了最后一个桶只包含数列最大值外,前面的各个桶区间都按照比例来确定
收藏数
10,529
精华内容
4,211