我正在尝试计算这个堆排序算法中的比较次数:
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,然而,每次当我试图在循环中计数+= 1而不是比较时,它要么显示0要么显示2001。
2条答案
按热度按时间ejk8hzay1#
你似乎忘记了在解决较小的子问题时考虑递归解决方案所做的比较。换句话说,您只能找到在解决方案的最高级别中进行的比较。相反,只要调用
heapify
函数,就应该更新相关作用域中的count
变量。请注意下面的更新,其中我将本地count
变量增加了heapify调用的返回值。Here是包含上述修复的代码的工作示例。我知道输出结果与您期望的比较的确切数量仍然略有不同,但它是在球场上。相对较小的距离是由于您正在随机化数组的初始状态。
ehxuflar2#
堆排序是基于堆的时间复杂度,这可能导致O(nlogn)+建立堆所需的时间