def partition(arr, lo, hi):
pivot = lo
for i in range(lo+1, hi+1):
if arr[i] <= arr[lo]:
pivot += 1
arr[i], arr[pivot] = arr[pivot], arr[i]
arr[lo], arr[pivot] = arr[pivot], arr[lo]
return pivot
def quickSort(arr, lo=0, hi=None):
if not hi: hi = len(arr) - 1
if lo >= hi: return
pivot = partition(arr, lo, hi)
quickSort(arr, lo, pivot-1)
quickSort(arr, pivot+1, hi)
arr = [5,3,2,-9,1,6,0,-1,9,6,2,5]
quickSort(arr)
print(arr)
的以下实现会遇到无限循环
partition
我认为MainActivity
函数是罪魁祸首。无法弄清楚错误。
由于
答案 0 :(得分:2)
有一次,你的循环永远不会在分区def中工作。见下文
[5, 3, 2, -9, 1, 6, 0, -1, 9, 6, 2, 5]
lo 0 hi 11
pivot 8
[5, 3, 2, -9, 1, 0, -1, 2, 5, 6, 6, 9]
lo 0 hi 7
pivot 7
[2, 3, 2, -9, 1, 0, -1, 5, 5, 6, 6, 9]
lo 0 hi 6
pivot 5
[-1, 2, -9, 1, 0, 2, 3, 5, 5, 6, 6, 9]
lo 0 hi 4
pivot 1
[-9, -1, 2, 1, 0, 2, 3, 5, 5, 6, 6, 9]
lo 0 hi 11
pivot 0
[-9, -1, 2, 1, 0, 2, 3, 5, 5, 6, 6, 9]
lo 1 hi 11
分区似乎没有正确完成整个工作,这是一个两步的过程。请参阅下面的示例分区def。另外,您可以参考原始来源here:
def partition(alist,first,last):
pivotvalue = alist[first]
leftmark = first+1
rightmark = last
done = False
while not done:
while leftmark <= rightmark and alist[leftmark] <= pivotvalue:
leftmark = leftmark + 1
while alist[rightmark] >= pivotvalue and rightmark >= leftmark:
rightmark = rightmark -1
if rightmark < leftmark:
done = True
else:
temp = alist[leftmark]
alist[leftmark] = alist[rightmark]
alist[rightmark] = temp
temp = alist[first]
alist[first] = alist[rightmark]
alist[rightmark] = temp
return rightmark
答案 1 :(得分:1)
问题在于hi
的初始化代码:
if not hi: hi = len(arr) - 1
如果not hi
为零,则条件True
为hi
。
这会导致quicksort(arr, 0, 0)
和quicksort(arr, 1, 0)
(其中一个几乎总是在排序过程中出现)尝试再次排序大部分列表,而不是递归的结束。 / p>
您应该使用更具体的测试if hi is None
而不是if not hi
。这样,如果{0}为零,则永远不会错误地重新初始化hi
,并且初始化代码仅在hi
为None
时才会运行,因为它未传递给用户的功能。