跳到主要内容

Python 堆排序实现的算法?

参考答案:

堆排序是一种基于二叉堆的排序算法,它的时间复杂度为O(nlogn),具有不稳定性和原地排序的特性。以下是一个Python实现的堆排序算法:

def heapify(arr, n, i):
    largest = i  # Initialize largest as root
    l = 2 * i + 1  # left = 2*i + 1
    r = 2 * i + 2  # right = 2*i + 2

    # Check if left child of root exists and is greater than root
    if l < n and arr[i] < arr[l]:
        largest = l

    # Check if right child of root exists and is greater than root
    if r < n and arr[largest] < arr[r]:
        largest = r

    # Change root, if needed
    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]  # swap

        # Heapify the root.
        heapify(arr, n, largest)


def heapSort(arr):
    n = len(arr)

    # Build a maxheap.
    for i in range(n, -1, -1):
        heapify(arr, n, i)

    # One by one extract elements
    for i in range(n-1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i]  # swap
        heapify(arr, i, 0)


# Test the function
arr = [12, 11, 13, 5, 6, 7]
heapSort(arr)
n = len(arr)
print("Sorted array is")
for i in range(n):
    print("%d" %arr[i]),

上述代码中,heapify函数负责保持堆的特性(即父节点的值大于或等于其子节点的值),而heapSort函数首先构建一个最大堆,然后交换堆顶元素和最后一个元素,并重新对剩下的元素进行堆化,这样最大值就被放到了数组的最后。重复这个过程,就可以得到排序后的数组。

需要注意的是,这个堆排序实现的是降序排序,如果你想进行升序排序,你需要在heapify函数中对largest的判断进行相应的调整。