当前位置:首页 > 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实现文件下载

PHP实现文件下载的方法 通过PHP实现文件下载功能,可以采用多种方式,以下是几种常见的实现方法: 使用header()函数强制下载 设置HTTP头信息,强制浏览器下载文件而非直接打开: $fi…

php实现搜索

php实现搜索

PHP实现搜索功能的方法 在PHP中实现搜索功能通常涉及数据库查询和用户输入的匹配。以下是几种常见的实现方式: 使用MySQL LIKE语句 通过简单的LIKE语句实现基础搜索: $searchT…

php 实现接口

php 实现接口

PHP 实现接口的方法 在 PHP 中,接口(Interface)用于定义一组方法的规范,而不包含具体的实现。类可以实现(implement)接口,并必须实现接口中定义的所有方法。 定义接口 接口通…

php 实现验证码

php 实现验证码

使用 PHP 生成验证码 验证码(CAPTCHA)用于防止自动化脚本提交表单,以下是几种常见的 PHP 实现方法。 使用 GD 库生成图片验证码 GD 库是 PHP 的图像处理扩展,可用于生成验证码…

php实现推送

php实现推送

PHP 实现推送功能的方法 PHP 实现推送功能可以通过多种方式完成,包括 WebSocket、Server-Sent Events (SSE)、长轮询或第三方推送服务。以下是几种常见的方法: 使用…