繁体   English   中英

我的快速排序算法是如何工作的?

[英]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 ,仅包含pivotgreater的列表)并返回。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM