对此非常困惑,因为我已经为足够小的测试用例验证了正确的逻辑输出(N = 20)。我尝试N = 10,000个数字,程序只是挂起,我不明白为什么......我已经尽可能简单地实现了算法。
此外,在我的N = 10k列表上调用sorted(data)
似乎几乎立即起作用。所以我确信我的算法只会卡在某处。
以下是代码:
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
所以我很遗憾为什么会发生这种情况。谢谢你的帮助。
答案 0 :(得分:5)
以下行似乎有一个拼写错误:
qsort(arr, 0, newPivotIndex)
我认为应该是这样的。
qsort(arr, left, newPivotIndex)
否则该函数将以某种方式仅对某些输入数据集起作用。这就是算法卡住的原因。
答案 1 :(得分:2)
注意:我没有检查你的算法所以可能有问题/ python可能因为某些原因不喜欢它但是: 快速排序将大致改善从N ^ 2到N log(N)的排序时间,但可能与N ^ 2一样糟糕,具体取决于输入数据。对于最佳数据,N = 10,000与N = 20相比,将是40,000 / 26 = 1538倍的因子。也许这只是处理?
对于最坏情况数据,它将是100,000,000 / 400 =慢25,000倍。你的数据是什么?
答案 2 :(得分:2)
Python通常会挂起深度递归函数,有时它会终止当前会话(如果你在IDLE中尝试它),并启动一个新的会话而根本不提供任何输出。试试这个:import sys; sys.setrecursionlimit(2**30)
,这可能有所帮助,但并非总是如此。