【问题标题】:can we call this function a quick sort我们可以称这个函数为快速排序吗
【发布时间】:2017-03-18 01:18:54
【问题描述】:

我在互联网上找到了这个用 python 编写的函数,我很困惑它是否是一种快速排序,因为它是写在一行中的,而且它工作得非常好而且很快,我认为它可以处理 O 的复杂性( n*log n) 即使在最坏的情况下,代码如下:

def qsort(L): 
  return (qsort([x for x in L[1:] if x < L[0]]) +\
          L[0:1] + \
          qsort([x for x in L[1:] if x >= L[0]])) if L else []

【问题讨论】:

  • 看起来像快速排序。
  • 将这一行分成多行以理解它。如果它妨碍可读性,那么仅仅为了它而使用一个衬垫通常是一个糟糕的主意......
  • 是的,这是一个快速排序。 (它使用的空间不是最理想的,但它仍然很重要。)
  • 是的,看起来像快速排序。但请记住,快速排序的最坏情况复杂度是 O(n^2),而不是 O(n*log n)。
  • 建立在之前的评论之上:看看当输入列表已经有序时会发生什么。

标签: python complexity-theory quicksort


【解决方案1】:

是的,它是快速排序,因为它完全符合此算法定义:从列表中选取任意元素,将低于此元素的值移动到列表的开头(在选定元素之前)并递归执行快速排序:

qsort([x for x in L[1:] if x < L[0]])

大于或等于列表末尾的值(在选定元素之后)并递归执行快速排序

qsort([x for x in L[1:] if x >= L[0]])

如果列表为空(递归终止),那么结果当然是空列表。

【讨论】:

  • 我是这么认为的,但是当我测试她的速度时,我发现它比 megeSort 更好
  • 据我记得,虽然合并和快速排序都具有平均复杂性,但 nlogn 快速排序在典型随机分布方面表现更好
猜你喜欢
  • 2014-06-08
  • 2021-09-29
  • 2019-12-30
  • 1970-01-01
  • 2015-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多