我知道这是一个非常受欢迎的主题,但我真的无法在这里找到我的问题。
import random
class QuickSort(object):
def _choose_pivot(self,l,r):
return random.sample(range(l,r),1)[0]
def _partition(self,arr,l,r):
pivot_idx = self._choose_pivot(l, r) #random pivot
#move the pivot to the end
pivot = arr[pivot_idx]
temp = arr[r-1]
arr[r-1] = arr[pivot_idx]
arr[pivot_idx] = temp
print arr
i = l
for j in range(l,r-1):
if arr[j]<=pivot:
temp = arr[j]
arr[j] = arr[i]
arr[i] = temp
i+=1
#put pivot in its place
temp = arr[i]
arr[i] = arr[r-1]
arr[r-1] = temp
return i
def sort(self,arr,l,r):
if len(arr) <= 1:
return arr
if r-l<=2:
return arr
pivot_idx = self._partition(arr, l , r)
self.sort(arr, pivot_idx+1 , r)
self.sort(arr, l , pivot_idx-1)
return arr
例如对于输入a = [8,5,6,2,1,0,4,3],它返回[1,0,2,3,5,6,4,8]。似乎我对基本案例的递归调用存在问题。它没有为每个分区调用sort函数:所以这里的步骤是:
pivot 2
[8, 5, 6, 3, 1, 0, 4, 2]
[1, 5, 6, 3, 8, 0, 4, 2]
[1, 0, 6, 3, 8, 5, 4, 2]
pivot 8
[1, 0, 2, 3, 6, 5, 4, 8]
[1, 0, 2, 3, 6, 5, 4, 8]
[1, 0, 2, 3, 6, 5, 4, 8]
[1, 0, 2, 3, 6, 5, 4, 8]
[1, 0, 2, 3, 6, 5, 4, 8]
pivot 3
[1, 0, 2, 5, 6, 3, 4, 8]
pivot 6
[1, 0, 2, 3, 5, 6, 4, 8]
[1, 0, 2, 3, 5, 6, 4, 8]
答案 0 :(得分:1)
您似乎使用Python范围表示法:在范围(l,r)中,包含l,r不包含。
因此,数组的分区如下:arr[l:pivot_idx] + [arr[pivot_idx]] + arr[pivot_idx+1:r]
。
所以我认为错误将通过使用以下行解决:self.sort(arr, l , pivot_idx)
。
此外,数组中只有一个元素iff r-l<=1
。