📜  算法|算法分析|问题19(1)

📅  最后修改于: 2023-12-03 15:41:09.569000             🧑  作者: Mango

算法|算法分析|问题19

算法简介

在本篇文章中,我们将介绍常见的排序算法——堆排序(Heap Sort)。堆排序是一种选择排序,特别之处在于使用了堆这种数据结构。堆是一个近似完全二叉树的结构,并同时满足堆的性质:即父节点的键值总是大于或者等于(小于或等于)任何一个子节点的键值。

算法分析
时间复杂度

堆排序的时间复杂度为 O(n log n)。

空间复杂度

堆排序是一种不稳定的排序算法。它的空间复杂度为 O(1)。

算法步骤

堆排序的具体实现分为两个步骤:

  1. 创建一个堆(大根堆或小根堆),把数组中的所有元素都依次插入到堆中。
  2. 依次从堆中取出元素,从小到大(或从大到小)排序。

下面是具体的算法实现:

def heapify(arr, n, i): 
    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: 
        arr[i],arr[largest] = arr[largest],arr[i]
 
        # 继续堆化修改后的子树
        heapify(arr, n, largest)
 
def heapSort(arr): 
    n = len(arr)
 
    # 创建最大堆
    for i in range(n, -1, -1): 
        heapify(arr, n, i)
 
    # 从堆中取出元素,从小到大排序
    for i in range(n-1, 0, -1): 
        arr[i], arr[0] = arr[0], arr[i]   # 交换根节点和最后一个
        heapify(arr, i, 0) 
 
# 测试
arr = [12, 11, 13, 5, 6, 7] 
heapSort(arr) 
print(arr)
总结

堆排序是一种高效的排序算法,它的时间复杂度为 O(n log n),空间复杂度为 O(1)。但是,堆排序的实现比较复杂,需要掌握堆这种数据结构才能熟练地使用。我们可以在排序数据量比较大的时候选用堆排序算法。