python-3.x 堆排序算法比较次数

92vpleto  于 2023-06-07  发布在  Python
关注(0)|答案(2)|浏览(95)

我正在尝试计算这个堆排序算法中的比较次数:

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。

ejk8hzay

ejk8hzay1#

你似乎忘记了在解决较小的子问题时考虑递归解决方案所做的比较。换句话说,您只能找到在解决方案的最高级别中进行的比较。相反,只要调用heapify函数,就应该更新相关作用域中的count变量。请注意下面的更新,其中我将本地count变量增加了heapify调用的返回值。

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]
        count += 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] 
        count += heapify(arr, i, 0)
    return count

Here是包含上述修复的代码的工作示例。我知道输出结果与您期望的比较的确切数量仍然略有不同,但它是在球场上。相对较小的距离是由于您正在随机化数组的初始状态。

ehxuflar

ehxuflar2#

堆排序是基于堆的时间复杂度,这可能导致O(nlogn)+建立堆所需的时间

相关问题