为什么我的QuickSort比较计数器不起作用?

时间:2015-07-23 05:49:53

标签: python algorithm counter quicksort

我的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

我最后使用的测试用例是正确的。

2 个答案:

答案 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