在Python中使用一个变量对函数输入进行快速排序



我知道人们会说这是重复的,但我发现的代码不起作用,我不知道如何修复它,所以这不是重复的,因为我问的是如何修复我的代码,而不是解决问题本身。这是代码:

def partition(array, start, end):
pivot = array[start]
low = start + 1
high = end
while True:
while low <= high and array[high] >= pivot:
high = high - 1
while low <= high and array[low] <= pivot:
low = low + 1
if low <= high:
array[low], array[high] = array[high], array[low]
else:
break
array[start], array[high] = array[high], array[start]
return high
def qsort(array):
start = min(array)
end = max(array)
if start >= end:
return
p = partition(array, start, end)
qsort(array, start, p-1)
qsort(array, p+1, end)

每次我尝试使用它时,我都会崩溃。我让qsort成为一个单变量函数,然后将结束设置为最大值,将开始设置为最小值。我在尝试使用它时遇到的崩溃如下所示:

qsort([1,5,1,6])
>>>Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "main.py", line 88, in qsort
p = partition(array, start, end)
File "main.py", line 73, in partition
while low <= high and array[high] >= pivot:
IndexError: list index out of range

我知道这意味着我超过了最大值,或者有一个stackoverflow(哈哈(,但我不知道如何在我的代码中修复它。帮助

除了逻辑,我从代码中可以看到,startend包含数组值,应该是索引。应将start初始化为0,将end初始化为len(array)-1

代码需要一个入口函数或在调用代码中进行更改,才能使用带有参数start和end 的递归函数

def partition(array, start, end):
pivot = array[start]
low = start + 1
high = end
while True:
while low <= high and array[high] >= pivot:
high = high - 1
while low <= high and array[low] <= pivot:
low = low + 1
if low <= high:
array[low], array[high] = array[high], array[low]
else:
break
array[start], array[high] = array[high], array[start]
return high
def qsortr(array, start, end):          # recursive function
if start >= end:
return
p = partition(array, start, end)
qsortr(array, start, p-1)
qsortr(array, p+1, end)
def qsort(array):                       # entry function
qsortr(array, 0, len(array)-1);       # fix
A = [1,5,1,6]
qsort(A)
print(A)

用于排序512K int 的备用测试代码

import random
from time import time
# test sort
a = [random.randint(0, 2147483647) for r in xrange(512*1024)]
s = time()
qsort(a)
e = time()
print e - s
# check to see if data was sorted
f = 0
for i in range (1, len(a)):             # use xrange for python 2.x
if(a[i-1] > a[i]):
f = 1
break
if(f == 0):
print("sorted")
else:
print("error")

最新更新