【问题标题】:Implementing Quick Sort in Python在 Python 中实现快速排序
【发布时间】:2018-06-09 14:07:40
【问题描述】:

我正在尝试实现快速排序。看起来很简单,实现一个数据透视函数,以便将较小的元素和较大的元素聚集在两个单独的列表中。递归执行此操作,直到列表小到可以在恒定时间内排序。

def pivot(a, pivot_index):
    # I guess you can keep two indexes one greater and one lesser and swap.
    i, j = 0, len(a)-2
    p = a[pivot_index]
    a[pivot_index] = a[len(a)-1]
    a[len(a)-1] = p

    while(i<j):
        if(a[i]<p):
            i = i + 1
        if(a[i]>p):
            temp = a[i]
            a[i] = a[j]
            a[j] = temp
            j = j - 1
        #print(a)
    return a[0:i], a[i:]

def quicksort(a):
    if len(a) <= 1:
        return a
    p = len(a)//2
    l1, l2 = pivot(a, p)
    return quicksort(l1) + quicksort(l2)

if __name__ == "__main__":
    a = [1,-9,288,91,3,4,58,67,8]
    print(quicksort(a))

我得到错误:

Traceback (most recent call last):
  File "11.py", line 79, in <module>
    print(quicksort(a))
  File "11.py", line 73, in quicksort
    return quicksort(l1) + quicksort(l2)
  File "11.py", line 73, in quicksort
    return quicksort(l1) + quicksort(l2)
  File "11.py", line 73, in quicksort
    return quicksort(l1) + quicksort(l2)
  [Previous line repeated 993 more times]

Traceback (most recent call last):
  File "11.py", line 76, in <module>
    print(quicksort(a))
  File "11.py", line 70, in quicksort
    return quicksort(l1) + quicksort(l2)
  File "11.py", line 70, in quicksort
    return quicksort(l1) + quicksort(l2)
  File "11.py", line 70, in quicksort
    return quicksort(l1) + quicksort(l2)
  [Previous line repeated 993 more times]
  File "11.py", line 69, in quicksort
    l1, l2 = pivot(a, p)
  File "11.py", line 54, in pivot
    while(i<j):
RecursionError: maximum recursion depth exceeded in comparison

可能正在发生的事情是在快速排序中从未调用基本情况。但不知道如何解决。

【问题讨论】:

  • @cᴏʟᴅsᴘᴇᴇᴅ 不起作用,但为什么首先应该完成它?...pivot 需要遍历列表...
  • 没关系,误读你的代码。
  • 在每个函数的开头,打印参数,这样你就知道函数是如何被调用的。您肯定会看到重复,然后可以轻松找出它是如何发生的。
  • 我建议花一点时间学习如何使用日志包,而不是使用 print 进行此类调试。但结构化演练(白板“测试”)对于这种算法分析仍然是一项有价值的技能。成为 CPU 并演练代码在做什么。
  • @JimDennis 嗯,日志包在这里有什么优势?对我来说似乎有点矫枉过正。

标签: python python-3.x algorithm sorting recursion


【解决方案1】:

以下功能解释了快速排序的准确程度 通过将输入数据作为数组发送到快速排序函数来实现。 这里我们使用递归实现了快速排序,如下所示:

  1. 首先检查数组是否包含超过 1 个元素。如果数组中有小于或等于一个元素,则返回数组。(if len(arr) )
  2. 现在从数组中间取一个枢轴元素(从数组的一半大小中检索元素),然后在第一次迭代中计算枢轴元素(pivot = arr[len(arr)//2] )
  3. 如果数组中的元素小于枢轴元素,则使用 python 中的列表推导创建一个左数组(left = [x for x in arr if x )

  4. 如果数组中的元素等于枢轴元素,则创建一个中间数组(middle = [x for x in arr if x == pivot])

    李>
  5. 如果数组中的元素多于枢轴元素,则创建一个右数组(right = [x for x in arr if x > pivot]

  6. 将左数组、右数组发送到快速排序函数并递归重复它们,直到数组中的所有元素都排序完毕。
 def quicksort(arr):
          if len(arr) <= 1:
             return arr
          pivot = arr[len(arr)//2]
          left = [x for x in arr if x < pivot]
          middle = [x for x in arr if x == pivot]
          right = [x for x in arr if x > pivot]
          return quicksort(left) + middle + quicksort(right)

【讨论】:

  • 即使您的帖子回答了 OP 的问题。请不仅提供有效的 sn-p。但是请解释发生了什么,为什么它会做它应该做的等等。
  • @Lino:是的,我已经解释了它是如何使用 python 实现的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
  • 2019-11-20
  • 1970-01-01
  • 2011-03-29
相关资源
最近更新 更多