我的QuickSort实现,总是选择第一个元素作为支点。但是,当我尝试添加计数器进行比较时,它无法正常计数。我的问题是如何在使用第一个元素作为支点时计算比较?有人可以帮我修改我的代码。
counter = 0
def Partition(L):
global counter
pivot = L[0]
i = 0
swap = 0
for j in range(1,len(L)):
if L[j] <= pivot:
swap = L[i]
L[i] = L[j]
L[j] = swap
i += 1
counter += 1
swap = L[0]
L[0] = L[i-1]
L[i-1] = swap
return QuickSort(L[:i]) + QuickSort(L[i:])
def QuickSort(L):
if len(L) <= 1:
return L
return Partition(L)
print QuickSort([3,9,8,4,6,10,2,5,7,1])
print 'Correct ANS: 25'
print 'My ANS: ',counter
我最后使用的测试用例是正确的。
答案 0 :(得分:0)
您的错误是您在对quicksort的递归调用中包含pivot元素。该算法仍然有效,但它需要更多的比较。而是将递归调用更改为:
QuickSort(L[:i]) + QuickSort(L[i+1:])
你应该被设定。
答案 1 :(得分:0)
我终于做对了!代码需要一些改进,但它可以工作!
counter = 0
def Partition(L):
global counter
pivot = L[0]
i = 1
swap = 0
bigger = []
pivotList = []
less = []
for j in range(1,len(L)):
if L[j] < pivot:
swap = L[i]
L[i] = L[j]
L[j] = swap
i += 1
swap = L[0]
L[0] = L[i-1]
L[i-1] = swap
less = L[:i-1]
bigger = L[i:]
pivotList = [L[i-1]]
counter += len(less) + len(bigger) # Do NOT COUNT PIVOT AS COMPARISON
return QuickSort(less)+ pivotList + QuickSort(bigger)
def QuickSort(L):
if len(L) <= 1:
return L
return Partition(L)
#Test case:
QuickSort(7, 5, 1, 4, 8, 3, 10, 2, 6, 9) # correct ANS = 21
print counter