Python 桶排序比快速排序快
我用Python编写了一个程序,用不同的算法对随机创建的包含5000个数字的列表进行排序,并比较时间。Python 桶排序比快速排序快,python,algorithm,sorting,Python,Algorithm,Sorting,我用Python编写了一个程序,用不同的算法对随机创建的包含5000个数字的列表进行排序,并比较时间。 快速排序通常比桶排序慢,为什么? 我认为快速排序更快 这是我的节目: 快速分类 好的。开始时,尽量不要命名已经有键名的变量,例如list列表已经为python内置,将覆盖过去被认为是列表的内容 桶排序: 假设我们有一个列表[29,25,3,49,9,37,21,43]。使用bucket sort,它将这些值中的一些分组到bucket中,如下所示 本例中的桶组值为[0,9],[10-19],[
快速排序通常比桶排序慢,为什么?
我认为快速排序更快 这是我的节目: 快速分类
好的。开始时,尽量不要命名已经有键名的变量,例如list<代码>列表已经为python内置,将覆盖过去被认为是
列表
的内容
桶排序
:假设我们有一个列表
[29,25,3,49,9,37,21,43]
。使用bucket sort,它将这些值中的一些分组到bucket中,如下所示
本例中的桶组值为[0,9]
,[10-19]
,[20-29]
,[30-39]
和[40-49]
。
一旦创建了bucket,就会在每个bucket上使用排序算法,该算法可以是任何东西,包括bucket sort。通常,在桶排序中,算法将查看最高有效位,并将其与另一个值的最高有效位进行比较,如果它们匹配,则将逐位递减,直到清楚哪个更大。这种类型的排序也可以用于字符、列表等
最高有效位(MSB)比较的快速示例:
3对9二进制中的3是0011 二进制中的9是1001
在本例中,从最左边的位开始,我们看到0代表3,1代表9,因此9更大。
在对每个桶进行排序后,您将得到以下结果:
桶排序的另一个示例可以在这里找到:
快速排序
:
使用快速排序,您可以从拾取轴元素开始。
然后对数组重新排序,使值小于轴的元素位于轴之前,值大于轴的元素位于轴之后。
然后对具有较小值的元素列表和具有较大值的元素列表递归执行此操作。这个概念非常简单,但是如果你不熟悉算法,选择一个好的支点也是一个挑战
现在…为什么桶排序更快?
由于快速排序所涉及的递归和轴心点,您通常仅限于O(n*log(n))
由于bucket sort中bucket的排序算法是MSB,因此该排序算法的时间复杂度是O(n+k)
现在,如果您选择一种较慢的排序算法来在bucket sort中对bucket进行排序,那么快速排序可能会更快
我知道这是一个非常高层次的概述,可能有点混乱,但希望它足以帮助您理解为什么桶排序比快速排序快,以及快速排序如何比桶排序快。如您所知,当您必须对大量元素进行排序时,快速排序是一个不错的选择。在处理较小的集合时,桶排序可能是更好的选择
快速排序是分而治之算法的一个示例,它在
递归调用,用于划分数据(使用分区)。在这种情况下,您的算法不是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
def快速排序(seq):
如果len(seq)
由于这里给出了快速排序的代码,它使用了两个新列表。i、 e、lo&hi
快速排序的特点是不使用新的MemorySpace
因此,回答的代码是一个很好的解决方案,但它确实打破了与快速合并排序的逻辑差异
(代码是修改后的版本,取自下面给出的源代码)
def快速排序(列表):
快速排序器(列表,0,列(列表)-1)
def quickSortHelper(列表、第一个、最后一个):
如果firstFWIW,list
是一个非常糟糕的名称,因为它隐藏了相同名称的内置类。很抱歉,我在学习,通常快速排序是作为一个就地算法编写的。修正这个问题会使你的代码速度提高一倍,也许是2倍。这个答案根本没有帮助。OP要么阅读我关于为什么bucket sort更快的答案,要么从其他地方阅读。这个问题在互联网上和很多关于排序算法的教科书中已经存在了很长时间,不值得再解释。在编写代码之前,我查看了这些链接以了解算法,我不明白为什么我的问题不好。不管怎样,我重新调查了这些网站,但我还是不明白。谢谢你的帮助,我的英语很抱歉谢谢,我不知道pythonic代码是什么样子:),但是为什么我的算法不是一个真正的快速排序?为什么你只使用一个空格作为缩进?在python脚本中对空格执行此操作:每个缩进级别4个空格。没有硬标签。不要把标签和空格混在一起。这正是IDLE和Emacs Python模式所支持的。其他编辑器也可以提供这种支持。函数之间有一个空行。类之间有两个空行。谢谢,既然可以在快速排序函数中,为什么还要创建一个分区函数呢?很抱歉问您这么多问题,我正在尝试获取尽可能多的信息。当您有少量数据要排序时,bucket sort不一定是好的,但是当从少量可能的值中提取关键字时。
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
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
def quickSort(alist):
quickSortHelper(alist,0,len(alist)-1)
def quickSortHelper(alist,first,last):
if first<last:
splitpoint = partition(alist,first,last)
quickSortHelper(alist,first,splitpoint-1)
quickSortHelper(alist,splitpoint+1,last)
def partition(alist,first,last):
pivotvalue = alist[first]
leftmark,rightmark = first+1,last
done = False
while not done:
while leftmark <= rightmark and alist[leftmark] <= pivotvalue:
leftmark = leftmark + 1
while alist[rightmark] >= pivotvalue and rightmark >= leftmark:
rightmark = rightmark -1
if rightmark < leftmark:
done = True
else:
alist[first],alist[rightmark] = alist[rightmark],alist[first]
alist[first],alist[rightmark] = alist[rightmark],alist[first]
return rightmark
alist = [54,26,93,17,77,31,44,55,20]
quickSort(alist)
print(alist)