Python实现堆排序算法:原理、代码与实例解析

Mia
Mia
发布时间:2026-10-10| 2人浏览过
原创

本文深入解析Python中堆排序算法的实现原理,通过构建小顶堆并逆向遍历输出元素,展示如何高效完成排序。文章包含完整的Python代码示例,利用NumPy处理数据,详细讲解MakeHeap与AdjustHeap函数的逻辑,帮助开发者理解堆排序的核心机制与具体用法。

堆排序算法核心原理

堆排序(Heap Sort)是一种基于二叉堆数据结构的比较排序算法。其核心思想是将待排序数组视为一棵近似完全二叉树,利用堆的性质进行元素交换与调整。在堆结构中,父节点与子节点之间存在特定的大小关系:若为小顶堆,父节点的值小于或等于其子节点;若为大顶堆,则相反。通过反复调整堆结构,可以将最大值或最小值“浮”至堆顶,从而实现排序。

Python代码实现详解

以下代码展示了如何使用Python及NumPy库实现堆排序。代码主要包含三个函数:MakeHeap用于构建初始堆,AdjustHeap用于调整节点以维持堆性质,HeapSort则执行完整的排序流程。

#-*- coding: UTF-8 -*-
import numpy as np

def MakeHeap(a):
  for i in xrange(a.size / 2 - 1, -1, -1):#对非叶子节点的子节点进行调节,构建堆
    AdjustHeap(a, i, a.size)

def AdjustHeap(a, i, n):
  j = i*2 +1                     #选择节点i的左子节点
  x = a[i]                       #选择节点的数值
  while j < n:                    #循环对子节点及其子树进行调整
    if j + 1 < n and a[j+1] < a[j]:    #找到节点i子节点的最小值
      j += 1
    if a[j] >= x :                  #若两个子节点均不小于该节点,则不同调整
      break
    a[i], a[j] = a[j], a[i]             #将节点i的数值与其子节点中最小者的数值进行对调
    i = j                        #将i赋为改变的子节点的索引
    j = i*2 + 1                   #将j赋为节点对应的左子节点

def HeapSort(a):
  MakeHeap(a)                 #构建小顶堆
  for i in xrange(a.size - 1,0, -1):   #对堆中的元素逆向遍历
    a[i], a[0] = a[0], a[i]           #将堆顶元素与堆中最后一个元素进行对调,因为小顶堆中堆顶元素永远最小,因此,输出即为最小元素
    AdjustHeap(a, 0, i)          #重新调整使剩下的元素仍为一个堆

if __name__ == '__main__':
  a = np.random.randint(0, 10, size = 10)
  print "Before sorting..."
  print "---------------------------------------------------------------"
  print a
  print "---------------------------------------------------------------"
  HeapSort(a)
  print "After sorting..."
  print "---------------------------------------------------------------"
  print a[::-1]                    #因为堆排序按大到小进行排列,采用a[::-1]对其按从小到大进行输出
  print "---------------------------------------------------------------"

关键步骤解析

在MakeHeap函数中,算法从最后一个非叶子节点开始向前遍历,依次调用AdjustHeap对每个节点进行下沉调整,确保以该节点为根的子树满足堆性质。AdjustHeap函数通过比较当前节点与其左右子节点的大小,找到最小的子节点并与当前节点交换,若发生交换则继续向下调整,直至满足堆条件或到达叶子节点。

HeapSort函数首先调用MakeHeap构建小顶堆,此时堆顶元素为数组最小值。随后,算法将堆顶元素与数组末尾元素交换,并将剩余元素范围缩小,再次调用AdjustHeap调整新的堆顶,重复此过程直至所有元素排序完成。由于小顶堆每次取出的是最小值,最终数组呈降序排列,因此代码中通过a[::-1]反转数组以得到升序结果。

运行示例与结果

在示例中,程序生成一个包含10个随机整数(0-9)的NumPy数组。排序前,数组元素无序;经过HeapSort处理后,数组按降序排列。通过a[::-1]反转后,最终输出为升序排列的结果,验证了算法的正确性。

以上就是Python实现的堆排序算法原理与用法实例分析的详细内容,更多关于Python算法与数据结构的相关资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。