堆排序算法比较次数

时间:2017-12-05 13:35:07

标签: python python-3.x

我试图计算这种堆排序算法中的比较次数:

import random
import time

#HeapSort Algorithm
def heapify(arr, n, i):
    count = 0
    largest = i  
    l = 2 * i + 1     
    r = 2 * i + 2     
    if l < n and arr[i] < arr[l]:
        largest = l
    if r < n and arr[largest] < arr[r]:
        largest = r
    if largest != i:
        count += 1
        arr[i],arr[largest] = arr[largest],arr[i]
        heapify(arr, n, largest)
    return count

def heapSort(arr):

    n = len(arr)
    count = 0
    for i in range(n, -1, -1):
        heapify(arr, n, i)  
        count += heapify(arr, i, 0)
    for i in range(n-1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i] 
        heapify(arr, i, 0)

    return count

print("For n = 1000:")

print("a) Random Generation:")

arr = [x for x in range(1000)]
random.shuffle(arr)

print("Before Sort:")
print (arr)

print("After Sort:")
start_time = time.time()
heapSort(arr)
time = time.time() - start_time
print(arr)

print("Comparisions")
print(heapSort(arr))
print("Time:")
print(time) 

我期望当n = 1000整数时的结果为8421,而当n = 10000时,结果为117681 但是,每次它显示0或2001时,我试图在循环周围计算+ = 1而不是比较。

1 个答案:

答案 0 :(得分:1)

您似乎忘记在解决较小的子问题时考虑到递归解决方案所做的比较。换句话说,您只是在解决方案的最顶层找到了比较。相反,每当您调用mdy("Jul 01, 2017") 函数时,都应更新相关范围中的count变量。请注意下面的更新,我通过调用heapify的返回值增加了本地heapify变量。

count

Here是您的代码的一个工作示例,包括上面给出的修复程序。我知道输出仍然与你期望的确切比较数略有不同,但它仍然存在。相对较小的距离是由于您正在随机化数组的初始状态。