排序算法总结:
桶排序是一种用到了哈希表的排序方法。哈希表查找的方法是用取余做哈希函数,排序用取整做函数。
桶排序是计数排序的升级版,计数排序的索引是这个数字出现的次数,而桶排序则更加灵活,索引可以由哈希函数任意设置你想要的样子,哈希函数的设计是决定桶排序是否高效的前提。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。为了使桶排序更加高效,我们需要做到这两点:
- 在额外空间充足的情况下,尽量增大桶的数量
- 使用的映射函数能够将输入的 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)