Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中实现快速排序_Python_Python 3.x_Algorithm_Sorting_Recursion - Fatal编程技术网

在Python中实现快速排序

在Python中实现快速排序,python,python-3.x,algorithm,sorting,recursion,Python,Python 3.x,Algorithm,Sorting,Recursion,我正在尝试实现快速排序。看起来很简单,实现一个pivot函数,以便将较小的元素和较大的元素集中在两个单独的列表中。递归地执行此操作,直到列表足够小,可以在固定时间内进行排序 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_in

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

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))
def pivot(a,pivot_索引):
#我想你可以保留两个索引,一个大一个小,然后交换。
i、 j=0,len(a)-2
p=a[枢轴指数]
a[pivot_index]=a[len(a)-1]
a[len(a)-1]=p
而
下面的功能解释了快速排序是如何准确地进行的
通过将输入数据作为数组发送到quicksort函数来实现。
在这里,我们使用递归实现了快速排序,如下所示:

  • 首先检查数组是否包含多个元素。如果数组中的元素少于或等于一个,则返回数组。(如果len(arr)pivot]

  • 将左数组、右数组发送到quicksort函数,并递归地重复它们,直到对数组中的所有元素进行排序
  • def快速排序(arr):
    如果透镜(arr)枢轴]
    返回快速排序(左)+中间+快速排序(右)
    
    @cᴏʟᴅsᴘᴇᴇᴅ 不起作用,但为什么首先要这样做?…pivot需要遍历列表…别担心,误读代码。在每个函数开始时,打印参数,这样你就知道函数是如何调用的。你肯定会看到重复,然后就可以轻松地找出它是如何发生的。我建议花一点时间学习o使用日志包而不是打印进行此类调试。但也要进行结构化演练(白板“测试”)对于这种算法分析来说,仍然是一项很有价值的技能。作为CPU,仔细了解代码在做什么。@JimDennis-Hmm,日志软件包在这里有什么优势?对我来说似乎太过分了。即使你的帖子回答了OP的问题。请不仅提供一个有效的片段。还要解释发生了什么,为什么它会起作用@Lino:是的,我已经解释了它是如何使用python实现的
    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
    
     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)