我试图计算这种堆排序算法中的比较次数:
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而不是比较。
答案 0 :(得分:1)
您似乎忘记在解决较小的子问题时考虑到递归解决方案所做的比较。换句话说,您只是在解决方案的最顶层找到了比较。相反,每当您调用mdy("Jul 01, 2017")
函数时,都应更新相关范围中的count
变量。请注意下面的更新,我通过调用heapify的返回值增加了本地heapify
变量。
count
Here是您的代码的一个工作示例,包括上面给出的修复程序。我知道输出仍然与你期望的确切比较数略有不同,但它仍然存在。相对较小的距离是由于您正在随机化数组的初始状态。