Python中的快速排序-对于较大的输入大小,程序会挂起吗?

Python中的快速排序-对于较大的输入大小,程序会挂起吗?,python,algorithm,sorting,quicksort,Python,Algorithm,Sorting,Quicksort,对此相当困惑,因为我已经为足够小的测试用例(N=20)验证了正确的逻辑输出。我试着做N=10000个数字,程序就挂起了,我不明白为什么。。。我已经尽可能简单地实现了这个算法 此外,在我的N=10k列表中调用排序(数据),似乎几乎可以立即工作。所以我确信我的算法在某个地方卡住了 代码如下: def QuickSort(array): qsort(array, 0, len(array)) def qsort(arr, left, right): if ((right - lef

对此相当困惑,因为我已经为足够小的测试用例(N=20)验证了正确的逻辑输出。我试着做N=10000个数字,程序就挂起了,我不明白为什么。。。我已经尽可能简单地实现了这个算法

此外,在我的N=10k列表中调用
排序(数据)
,似乎几乎可以立即工作。所以我确信我的算法在某个地方卡住了

代码如下:

def QuickSort(array):
    qsort(array, 0, len(array))


def qsort(arr, left, right):
    if ((right - left) < 2):
        return

    pivotIndex = choosePivot0(arr, left, right)

    newPivotIndex = partition(arr, pivotIndex, left, right)

    qsort(arr, 0, newPivotIndex)
    qsort(arr, newPivotIndex + 1, right)

def partition(arr, pivotIndex, left, right):
    swap(arr, pivotIndex, left)
    pivot = arr[left]
    i = left + 1
    for j in range(left+1, right):
        if (arr[j] < pivot):
            swap(arr, i, j)
            i = i + 1

    swap(arr, left, i-1) #put pivot back where it belongs
    #cobj.count = cobj.count + (right - left - 1) #add m-1 the #of comparisons
    return (i-1) #give back where the pivot resides



def swap(array, i, j):
    temp = array[i]
    array[i] = array[j]
    array[j] = temp

def choosePivot0(array, left, right):
    return randint(left, right-1) #random
def快速排序(数组):
qsort(数组,0,len(数组))
def qsort(arr、左、右):
如果((右-左)<2):
返回
pivotIndex=choosePivot0(arr、左、右)
newPivotIndex=分区(arr、pivotIndex、左、右)
qsort(arr,0,新数据透视索引)
qsort(arr,新数据透视索引+1,右)
def分区(arr、数据透视索引、左、右):
交换(arr,数据透视索引,左侧)
枢轴=arr[左]
i=左+1
对于范围内的j(左+1,右):
如果(arr[j]<枢轴):
交换(arr、i、j)
i=i+1
交换(arr,左,i-1)#将枢轴放回原位
#cobj.count=cobj.count+(右-左-1)#将m-1添加到比较中#
返回(i-1)#返回枢轴所在的位置
def交换(阵列,i,j):
温度=数组[i]
数组[i]=数组[j]
数组[j]=temp
def choosePivot0(阵列、左、右):
返回randint(左,右-1)#随机

所以我很不明白为什么会发生这种事。感谢您的帮助。

注意:我还没有检查您的算法,因此可能有问题/python可能出于某种原因不喜欢它,但是: 快速排序将大致将排序时间从N^2缩短到N log(N),但根据输入数据的不同,可能与N^2一样糟糕。在最佳数据条件下,N=10000比N=20慢40000/26=1538倍。也许只是在处理


在最坏情况下,数据速度将降低100000000/400=25000倍。您的数据是什么?

Python经常挂起深层递归函数,有时它只是终止当前会话(如果您在空闲状态下尝试),然后启动一个新会话,而不提供任何输出。试试这个:
importsys;sys.setrecursionlimit(2**30)
,这可能会有所帮助,但并不总是如此。

下面的一行似乎有输入错误:

qsort(arr, 0, newPivotIndex)
我想应该是这样

qsort(arr, left, newPivotIndex)

否则,该函数将仅对某些输入数据集起作用。这就是算法陷入困境的原因。

使用随机轴进行快速排序时,我只会期望有一次N^2的运行时间复杂性。数据只是按未排序顺序排列的1到10000个整数的一般列表。如果您没有向其提供rnd数据,只需询问一下。您的代码对10k数据进行排序需要多长时间?我实现了一个非常简单的qsort,并且
sys.setrecursionlimit(2**30)
,排序
[2,3,5]*10000,一个30k的数据大约需要20~30秒。你现在是我最喜欢的人。非常感谢,这就解决了问题。