Quicksort:无限循环

时间:2016-09-28 04:55:21

标签: python sorting infinite-loop quicksort

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函数是罪魁祸首。无法弄清楚错误。

由于

2 个答案:

答案 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为零,则条件Truehi

这会导致quicksort(arr, 0, 0)quicksort(arr, 1, 0)(其中一个几乎总是在排序过程中出现)尝试再次排序大部分列表,而不是递归的结束。 / p>

您应该使用更具体的测试if hi is None而不是if not hi。这样,如果{0}为零,则永远不会错误地重新初始化hi,并且初始化代码仅在hiNone时才会运行,因为它未传递给用户的功能。