当前位置:首页 > PHP

php 实现堆排序

2026-02-15 12:32:26PHP

堆排序原理

堆排序是一种基于二叉堆数据结构的比较排序算法。利用最大堆或最小堆的特性,将待排序数组构造成堆结构,通过反复调整堆实现排序。时间复杂度为O(n log n),空间复杂度为O(1)。

堆排序实现步骤

构建最大堆:从最后一个非叶子节点开始,向上调整每个子树使其满足堆性质。数组下标为i的节点,其左子节点为2i+1,右子节点为2i+2。

堆调整:将堆顶元素(最大值)与末尾元素交换,缩小堆范围后重新调整堆结构,直到所有元素有序。

php 实现堆排序

PHP代码实现

function heapSort(&$arr) {
    $n = count($arr);

    // 构建最大堆(初始调整)
    for ($i = floor($n/2) - 1; $i >= 0; $i--) {
        heapify($arr, $n, $i);
    }

    // 逐个提取堆顶元素
    for ($i = $n - 1; $i > 0; $i--) {
        // 移动当前堆顶到末尾
        [$arr[0], $arr[$i]] = [$arr[$i], $arr[0]];
        // 调整剩余元素的新堆
        heapify($arr, $i, 0);
    }
}

function heapify(&$arr, $n, $i) {
    $largest = $i;      // 初始化最大值为根节点
    $left = 2 * $i + 1; // 左子节点
    $right = 2 * $i + 2; // 右子节点

    // 比较左子节点
    if ($left < $n && $arr[$left] > $arr[$largest]) {
        $largest = $left;
    }

    // 比较右子节点
    if ($right < $n && $arr[$right] > $arr[$largest]) {
        $largest = $right;
    }

    // 如果最大值不是根节点
    if ($largest != $i) {
        [$arr[$i], $arr[$largest]] = [$arr[$largest], $arr[$i]];
        // 递归调整受影响的子树
        heapify($arr, $n, $largest);
    }
}

// 使用示例
$array = [12, 11, 13, 5, 6, 7];
heapSort($array);
print_r($array);

关键点说明

数组索引计算:PHP数组从0开始索引,因此左子节点为2i+1而非2i。

交换操作:使用数组解构语法[$a, $b] = [$b, $a]实现高效值交换,避免临时变量。

php 实现堆排序

递归调整:当堆结构发生变化时,需要递归调整受影响的子树以维持堆性质。

性能优化建议

对于大规模数据,可考虑使用SplHeap等PHP内置堆结构替代手动实现。

迭代版heapify:对于深度较大的堆,可用循环替代递归防止栈溢出。

标签: php
分享给朋友:

相关文章

php实现打印功能

php实现打印功能

PHP实现打印功能的方法 在PHP中实现打印功能可以通过多种方式完成,包括直接输出到浏览器、生成PDF文件、调用打印机接口等。以下是几种常见的方法: 直接输出HTML内容 PHP可以通过echo或p…

php实现栈

php实现栈

栈的基本概念 栈(Stack)是一种遵循后进先出(LIFO)原则的数据结构。核心操作包括: push:元素入栈。 pop:元素出栈(返回并移除栈顶元素)。 peek:查看栈顶元素…

php实现mysql

php实现mysql

PHP 连接 MySQL 的基本方法 PHP 提供了多种方式与 MySQL 数据库进行交互,以下是最常用的几种方法。 使用 MySQLi 扩展 MySQLi 是 MySQL 的改进扩展,支持面向对…

php 实现下载

php 实现下载

PHP 实现文件下载的方法 使用 PHP 实现文件下载可以通过设置 HTTP 头信息,强制浏览器将文件作为附件下载而非直接打开。 基本下载实现 $file_path = 'path/to/your/…

php 实现mvc

php 实现mvc

PHP 实现 MVC 架构的方法 MVC(Model-View-Controller)是一种常见的软件设计模式,用于分离业务逻辑、用户界面和用户输入。以下是 PHP 实现 MVC 架构的关键步骤:…

php 链表实现

php 链表实现

在 PHP 中实现链表可以通过类来模拟链表节点(Node)和链表(LinkedList)结构。以下是链表的完整实现示例,包含基础操作如插入、删除、遍历等。 链表节点类(Node) 链表的基本单元是节…