python实现【堆排序】(Heap Sort)

python实现【堆排序】(HeapSort)

算法原理及介绍

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法*实质是一个近似完全二叉树的结构*,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序

算法过程描述

  1. 将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,此堆为初始的无序区;

  2. 将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满足R[1,2…n-1]<=R[n];

  3. 由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,……Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2….Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。

算法排序图解如下

python实现代码

def heapify(arr, n, i):
    # 构建大顶堆
    largest = i
    l = 2 * i + 1  # left = 2*i + 1
    r = 2 * i + 2  # right = 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)
    return arr

想了解其他排序相关算法可以,看作者的排序算法专栏。

如果喜欢作者,欢迎点赞、收藏及关注,谢谢!

欢迎扫描下面二维码关注公众号:阿旭算法与机器学习, 可以和作者共同学习交流。
python实现【堆排序】(Heap Sort)_第1张图片

你可能感兴趣的:(算法与数据结构,#,python之排序算法,算法,二叉树,排序算法,python,数据结构)