欢迎访问宙启技术站
智能推送

Python函数实现数据结构和算法中的堆排序

发布时间:2023-06-17 09:43:08

堆排序是一种常见的排序算法,它的时间复杂度为O(nlogn),比较高效。堆排序利用了堆这种数据结构的特性来实现排序,因此我们需要先了解堆这种数据结构。

堆是一种特殊的完全二叉树,它具有以下两个特点:

1. 堆中每个节点的值都不大于(或不小于)其父节点的值。

2. 堆总是一棵完全二叉树,即除了最后一层节点可以不为满外,其它层的节点数都达到了其最大值。

堆分为两种:大根堆和小根堆。大根堆中每个节点的值都不小于其子节点的值,小根堆中每个节点的值都不大于其子节点的值。

堆排序的思路是先将待排序的数建成堆,然后将堆顶元素与最后一个元素交换位置,然后将剩下的元素再次建成堆,再将堆顶元素与倒数第二个元素交换位置,以此类推,直到所有元素都被排好序。

以下是python实现堆排序的代码和注释:

def heap_sort(array):
    # 将待排序的数建成大根堆
    def build_heap(array):
        # 从最后一个非叶子节点开始遍历
        for i in range(len(array) // 2 - 1, -1, -1):
            # 对每一个非叶子节点进行堆化
            heapify(array, i, len(array))

    # 对数组中的一个子树进行堆化
    def heapify(array, i, length):
        # 找出该节点的左右子节点
        left = 2 * i + 1
        right = 2 * i + 2
        # 假定该节点为最大值
        largest = i
        # 找出该节点、左子节点、右子节点中的最大值
        if left < length and array[left] > array[largest]:
            largest = left
        if right < length and array[right] > array[largest]:
            largest = right
        # 如果最大值不是该节点,则交换位置
        if largest != i:
            array[i], array[largest] = array[largest], array[i]
            # 递归堆化被交换的节点
            heapify(array, largest, length)

    # 堆排序
    build_heap(array)
    # 排序
    for i in range(len(array) - 1, 0, -1):
        # 交换堆顶元素和最后一个元素
        array[0], array[i] = array[i], array[0]
        # 对剩下的元素进行堆化
        heapify(array, 0, i)

    return array

# 测试
array = [4, 6, 2, 3, 7, 1, 5, 8, 9, 0]
print(heap_sort(array))  # 输出结果为[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

在这个代码中,我们首先定义了一个build_heap函数,用来将待排序的数建成大根堆。该函数的实现思路是从最后一个非叶子节点开始遍历,对每个非叶子节点进行堆化。

构建堆后,我们定义了一个heapify函数来对整个数组进行堆化。该函数的实现思路是找出该节点、左子节点和右子节点中的最大值,如果最大值不是该节点,则交换位置,并递归堆化被交换的节点。

最后,我们对堆进行排序。堆排序的实现思路是取出堆顶元素(即最大值),将其与最后一个元素交换位置,对剩下的元素进行堆化,然后再取出堆顶元素,将其与倒数第二个元素交换位置,以此类推,直至所有元素都被排好序。

在堆排序中,由于需要构建堆和堆化数组,时间复杂度为O(nlogn),相对于其他排序算法比较高效。同时,它还可以保持稳定性和不占用额外的内存空间。