Python快速排序仅部分排序

Python快速排序仅部分排序,python,algorithm,quicksort,Python,Algorithm,Quicksort,我正在学习快速排序算法,但出于某种原因,这个python实现的输出只是部分排序,我得到了较大输入的“最大递归深度”。在过去的几天里,我一直在努力解决这个问题,我知道这很可能是件很愚蠢的事情,但我似乎无法理解,所以我会感谢任何帮助 def ChoosePivot(list): return list[0] def Partition(A,left,right): p = ChoosePivot(A) i = left + 1 for j in range(l

我正在学习快速排序算法,但出于某种原因,这个python实现的输出只是部分排序,我得到了较大输入的“最大递归深度”。在过去的几天里,我一直在努力解决这个问题,我知道这很可能是件很愚蠢的事情,但我似乎无法理解,所以我会感谢任何帮助

def ChoosePivot(list):
    return list[0]  

def Partition(A,left,right):
    p = ChoosePivot(A)
    i = left + 1

    for j in range(left + 1,right + 1): #upto right + 1 because of range()
        if A[j] < p:
                A[j], A[i] = A[i], A[j] #swap
                i = i + 1
    A[left], A[i - 1] = A[i-1], A[left] #swap
    return i - 1

def QuickSort(list,left, right):
    if len(list) == 1: return   
    if left < right:
        pivot = Partition(list,left,right)              
        QuickSort(list,left, pivot - 1)
        QuickSort(list,pivot + 1, right)
        return list[:pivot] + [list[pivot]] + list[pivot+1:]

sample_array = [39,2,41,95,44,8,7,6,9,10,34,56,75,100] 
print "Unsorted list: " 
print sample_array
sample_array = QuickSort(sample_array,0,len(sample_array)-1)
print "Sorted list:"
print sample_array
def ChoosePivot(列表):
返回列表[0]
def分区(A、左、右):
p=选择一个选项(A)
i=左+1
对于范围内的j(左+1,右+1):#由于范围()
如果A[j]
不完全确定这是问题所在,但您选择了pivot错误:

def ChoosePivot(list):
    return list[0]  
def Partition(A,left,right):
    p = ChoosePivot(A)
    ....
您总是以原始列表的开头,而不是修改列表的开头

假设在某个点上,您将范围缩小到左=5,右=10-您选择列表[0]作为轴心-这不太好。
因此,在
left>0
的每次迭代中,您都会忽略列表中的第一个元素,并“忽略”它-这可以解释部分排序

def ChoosePivot(list):
    return list[0]
正如阿米特所说,这是错误的。您需要
p=A[左]
。然而,还有另一个问题:

if A[j] < p:
    A[j], A[i] = A[i], A[j] #swap
i = i + 1
如果A[j]
只有在交换数据时,数据透视索引才应增加。将
i=i+1
缩进到与交换相同的深度,作为
if
语句的一部分

附加问题:为什么要分区两次?

也是最后一次交换

A[left],A[i-1]=A[i-1],A[left]#swap

应该用枢轴来完成

除此之外,快速排序法也适用。所以你不需要跟随返回


返回列表[:pivot]+[list[pivot]]+list[pivot+1://p>不完全是对你问题的回答,但我相信它仍然是最相关的

在实现快速排序时,选择始终位于同一位置的轴是该算法的一个缺陷。可以生成一系列数字,使算法在O(n^2)时间内运行,绝对运行时间可能比bubblesort更糟糕

在算法中,选择最左边的项会使算法在最坏情况下运行,此时数组已经排序或接近排序

应随机选择轴以避免此问题。

在维基百科中查看算法的实现问题:


事实上,检查孔文章。这是值得你花时间的。

你应该从更高的层次考虑算法。这就是用C这样的语言编写它的方式。最好从功能上考虑。谢谢,就是这样。干杯,阿米特!随机选择一个轴只会降低在最坏情况下运行的可能性,因为没有什么可以阻止计算机随机选择最坏的轴-所以说随机选择可以避免问题是不正确的。另一种选择轴心以避免在二次时间内运行快速排序的方法是使用三种方法的中间值-取第一个、最后一个和中间值,然后选择中间值。