vlambda博客
学习文章列表

排序算法(6)——桶排序

       

桶排序

概念:

        桶排序 (Bucket sort)是通过映射函数将数组元素分到有限数量的桶里,再对每个桶内元素进行排序(可调用别的排序算法或是以递归方式继续使用桶排序进行排序)。


算法步骤:

(1)根据数组元素分布特征,创建合适数量的桶。

(2)选择合适的映射函数,将数组内元素映射到对应桶内(尽量保证这个函数能使元素均匀分布到每个桶内,以免空桶太多浪费空间)。

(3)对每个桶内的元素进行排序。

(4)将全部排序完毕的桶内元素放回数组中。


算法复杂度:

时间复杂度----平均: O(n+k)  |  最坏:O(n^2)  |  最好:O(n)

(映射函数的选择和每个桶使用的排序函数决定了桶排序的时间复杂度)

空间复杂度----O(n+k)(数组有n个元素,分到k个桶内)

稳定性----稳定


实例:

        如下图,桶的数量由最大值减最小值整除10再加1得到。(桶的数量由数据特点来决定,换了不同数据,不一定还是这么算)

        以下我这里使用快速排序作为每个桶内的排序算法,映射函数是(i - minimum)//10,i为数组中元素。(映射函数也是根据实际数据分布特点来设置,此处的只适用于本例子)

def quick_sort(seq): if len(seq) < 2: return seq else: base = seq[0] less = [i for i in seq[1:] if i <= base] greater = [j for j in seq[1:] if j > base] return quick_sort(less) + [base] + quick_sort(greater)

def bucket_sort(arr): maximum, minimum = max(arr), min(arr) bucketArr = [[] for i in range((maximum - minimum)//10+1)] # 设置桶的个数。 for i in arr: # 把每个数组的元素放到到对应的桶中。 index = (i - minimum)//10 bucketArr[index].append(i) arr.clear() for j in bucketArr: ls = quick_sort(j) # 使用别的排序方法来排序每个桶,在此使用快速排序。 arr.extend(ls) # 把每个桶内元素移动到数组中。 return arr
if __name__ == '__main__': list1 = [34, 23, 74, 35, 98, 34, 18, 88, 47, 51, 65, 75, 44, 89] sort_list = bucket_sort(list1)    print(sort_list)



以上若描述有误,还请留言指出,谢谢!