📜  用Python进行堆排序heap sort(1)

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

用Python进行堆排序(heap sort)

堆排序是一种排序算法,它利用堆数据结构来实现排序。堆排序的时间复杂度为O(nlogn),比较适合大型数据集合的排序。

堆数据结构

堆是一种基于完全二叉树的数据结构,它有两种类型:最大堆和最小堆。

  • 最大堆:父节点的键值总是大于或等于任何一个子节点的键值。
  • 最小堆:父节点的键值总是小于或等于任何一个子节点的键值。

堆的基本操作包括插入新值、删除最大/最小值、查找最大/最小值。

堆排序算法

堆排序算法的基本思路是:

  1. 将待排序的序列构建成最大堆。
  2. 将堆顶元素(最大值)与堆尾元素交换,并将堆的大小减1。
  3. 重复步骤2直到堆的大小为1。
  4. 结果为升序排列的序列。

Python代码实现:

def heap_sort(arr):
    # 构建最大堆
    n = len(arr)
    for i in range(n//2-1, -1, -1):
        heapify(arr, n, i)

    # 交换堆顶和堆尾元素,并减小堆的大小
    for i in range(n-1, 0, -1):
        arr[0], arr[i] = arr[i], arr[0]
        heapify(arr, i, 0)

def heapify(arr, n, i):
    largest = i  # 假设最大值为根节点
    left = 2*i + 1
    right = 2*i + 2

    # 如果左子节点比根节点大,将其设为最大值
    if left < n and arr[left] > arr[largest]:
        largest = left

    # 如果右子节点比根节点大,将其设为最大值
    if right < n and arr[right] > arr[largest]:
        largest = right

    # 如果最大值不是根节点,将其交换到根节点处
    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]
        heapify(arr, n, largest)
性能分析

堆排序算法的时间复杂度为O(nlogn),与归并排序算法相比性能稍差,但比较适合大型数据集合的排序。因为堆排序算法的操作主要是通过交换堆顶和堆尾元素来实现的,所以其空间复杂度为O(1)。

参考资料