python - 桶排序比快速排序更快

标签 python algorithm sorting

我用 Python 编写了一个程序,它使用不同的算法对随机创建的包含 5000 个数字的列表进行排序并比较时间。
Quicksort 通常比 Bucket sort 慢,为什么?
我认为 Quicksort 更快。

这是我的程序:

快速排序

def quicksort(seq):
    wall = 0
    pivot = seq[-1]
    for index, num in enumerate(seq):
        if num < pivot:
            seq[wall], seq[index] = seq[index], seq[wall]
            wall += 1
    seq[wall], seq[-1] = seq[-1], seq[wall]
    left = seq[:wall]
    if len(left) > 0:
        left = quicksort(left)
    right = seq[(wall + 1):]
    if len(right) > 0:
        right = quicksort(right)
    return left + [pivot] + right

桶排序

def bucket_sort(seq):
    biggest = 0
    for number in seq:
        if number > biggest:
            biggest = number
    buckets = []
    buckets.append([]) * (biggest / 10 + 1)
    for number in seq:
        buckets[number / 10].append(number)
    for index, bucket in enumerate(buckets):
        #Using quicksort to sort individual buckets
        buckets[index] = quicksort(bucket)
    new_list = [number for number in bucket for bucket in buckets]
    return new_list

最佳答案

如您所知,当您需要对大量元素进行排序时,快速排序 是一个不错的选择。当您处理较小的集合时,桶排序 可能是更好的选择。

Quicksort 是分而治之算法的一个例子,它在排序之前完成它的主要工作 递归调用,划分其数据(使用分区)。在这种情况下,您的算法不是 pythonic,也不是真正的快速排序算法!

所以我建议使用这个算法而不是那个:

def quicksort(seq):
    if len(seq) <= 1: 
        return seq
    lo, pi, hi = partition(seq)
    return quicksort(lo) + [pi] + quicksort(hi)

def partition(seq):
    pi, seq = seq[0], seq[1:]
    lo = [x for x in seq if x <= pi]
    hi = [x for x in seq if x > pi]
    return lo, pi, hi

关于python - 桶排序比快速排序更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25690175/

相关文章:

python - 制作备份文件+附加日期时间+如果文件存在则移动文件。 PYTHON

C# 比较 2 个数据表中的值

algorithm - 使用图表解决 "Water in buckets"脑筋急转弯

linq - 如何快速查找 List<T> 中的重复项,并更新原始集合

java - 这个快速排序算法是如何工作的?

python - 二分查找 : Not getting upper & lower bound for very large values

python + JSON : parse to list

python - 非平稳性是什么意思以及如何将其作为 10 臂强盗问题在强化学习中实现?

algorithm - 由路径定义的两个多边形的并集

c - 如何将结构体数组复制到同一数组中的另一个结构体?