在Python中实现快速排序

mou*_*nho 2 python sorting algorithm recursion python-3.x

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

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))
Run Code Online (Sandbox Code Playgroud)

我得到错误:

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
Run Code Online (Sandbox Code Playgroud)

可能发生的情况是基本案例从未在quicksort中调用。但是不确定如何解决它。

Pra*_*een 5

以下功能说明了如何通过将输入数据作为数组发送到快速排序功能来实现快速排序的方式。在这里,我们使用递归实现了quicksort,如下所示:

  1. 首先检查数组是否包含多个元素。如果数组中的元素少于或等于一个,则返回array。(如果len(arr)<= 1则返回arr
  2. 现在从数组的中间获取一个数据透视元素(从数组大小的一半获取元素),然后在第一次迭代中计算该数据透视元素(ivot = arr [len(arr)// 2]
  3. 如果阵列元素都小于枢轴元件然后使用列表中理解在python创建左阵列(左= [在ARR X对于x,如果x <枢轴]

  4. 如果数组中的元素等于数据透视元素,则创建一个中间数组(Middle = [x == pivot时,x用于arr中的x

  5. 如果数组中的元素多于枢轴元素,则创建一个右数组(right = [x =枢轴时,x用于arr中的x

  6. 将左数组,右数组发送到quicksort函数,然后递归地重复它们,直到对数组中的所有元素进行排序为止。
 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)
Run Code Online (Sandbox Code Playgroud)

  • 即使是您的帖子,也可以回答OP的问题。请仅提供一个有效的代码段。但是请解释发生了什么,为什么要这样做等等。 (3认同)