[英]How exactly does the loop within a bubble sort algorithm work? (Python 3)
[英]How does my Quick Sort algorithm work exactly?
我知道快速排序算法在理论中是如何工作的:
分而治之的概念。 将列表分为三个主要部分:
元件小于 Pivot 元件,
Pivot元件(中心元件),
元素大于 pivot 元素
重复此操作,直到所有内容都排序并放回原处。
我在我的 python 代码中实现了一个快速排序算法,它工作正常。 但我不明白它是如何工作的:
def quickSort(list, compare_fn):
if not list:
return list
pivot = list[0]
lesser = quickSort([x for x in list[1:] if compare_fn(x, pivot)], compare_fn)
greater = quickSort([x for x in list[1:] if not compare_fn(x, pivot)], compare_fn)
return lesser + [pivot] + greater
product_list = quickSort(product_list, lambda x,y: x[z] < y[z])
“z”是列表应按哪一列排序的变量。
如果有人能向我解释 function 的工作原理,我会非常高兴。 我也不确定 lambda 在这种情况下做了什么
我真的很感激帮助
这真的很简单......让我们从调用开始:
product_list = quickSort(product_list, lambda x,y: x[z] < y[z])
lambda
定义了一个匿名 function(一个“lambda”),它接受两个值 x 和 y,并检查x[z]
是否小于y[z]
。 在您的快速排序中,这是compare_fn
- 一个 function 接受两个值,如果第一个值小于第二个值,则返回True
,否则返回False
。
何必? 嗯......这样做意味着可以在不知道您如何确定“更少”在您的上下文中的含义的情况下编写quicksort
。 但是,如果元素是对象呢? 简单:只需传入比较字段的 lambda 即可。
下一个:快速排序本身。
pivot
- 您的代码只采用列表的第一个元素。 在 pivot 上使用哪个元素并不重要(除非您对列表有更多了解,但在一般情况下您不需要)
在对quickSort
的两个(递归)调用中,您有[x for x in list[1:] if compare_fn(x, pivot)]
(而对于greater
的相反)。
这个[x for x in list[1:]...]
构造是一个列表推导。 list[1:]
是您的列表的副本,但第一个元素(枢轴)除外。 对于lesser
,我们只使用小于 pivot 的元素,对于greater
pivot 的元素。
这个算法使用了一种叫做递归的东西。 基本上, quickSort
使用quickSort
来计算它的结果。 查一下,其他人比我能解释清楚。
最后,您只需 append 所有列表( lesser
,仅包含pivot
和greater
的列表)并返回。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.