当前位置:首页 > PHP

php 实现堆排序

2026-03-13 11:36:18PHP

堆排序的基本概念

堆排序是一种基于二叉堆数据结构的比较排序算法。二叉堆是一种完全二叉树,可以分为最大堆和最小堆。在最大堆中,父节点的值总是大于或等于子节点的值;在最小堆中,父节点的值总是小于或等于子节点的值。

php 实现堆排序

实现堆排序的步骤

构建最大堆:将无序数组构建成一个最大堆,此时堆顶元素为最大值。 交换堆顶与末尾元素:将堆顶元素与末尾元素交换,缩小堆的范围(排除已排序的部分)。 调整堆结构:对剩余的堆进行调整,使其重新满足最大堆的性质。 重复上述步骤,直到堆的大小为1。

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--) {
        // 交换堆顶和当前末尾元素
        $temp = $arr[0];
        $arr[0] = $arr[$i];
        $arr[$i] = $temp;

        // 调整堆
        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) {
        $temp = $arr[$i];
        $arr[$i] = $arr[$largest];
        $arr[$largest] = $temp;

        heapify($arr, $n, $largest);
    }
}

// 测试代码
$array = [12, 11, 13, 5, 6, 7];
heapSort($array);
print_r($array);

代码说明

heapSort函数是堆排序的主函数,负责构建最大堆和交换堆顶元素。heapify函数用于调整堆结构,确保父节点的值大于子节点的值。

构建最大堆时,从最后一个非叶子节点开始调整,逐步向上。交换堆顶元素后,重新调整堆结构,直到所有元素有序。

时间复杂度分析

堆排序的时间复杂度为O(n log n),其中构建堆的时间为O(n),每次调整堆的时间为O(log n)。堆排序是一种原地排序算法,空间复杂度为O(1)。

标签: php
分享给朋友:

相关文章

php实现文件下载

php实现文件下载

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

php长连接实现

php长连接实现

PHP 长连接实现方法 长连接(Keep-Alive)允许客户端与服务器在一次TCP连接中发送和接收多个HTTP请求/响应,减少重复建立连接的开销。以下是PHP中实现长连接的几种方式: 配置HTTP…

php实现异步

php实现异步

PHP 实现异步的方法 PHP 本身是同步执行的脚本语言,但可以通过以下方法模拟异步操作或实现异步效果: 使用多进程(pcntl_fork) 通过 pcntl_fork 创建子进程实现异步,适用于…

php实现的进度条

php实现的进度条

PHP 实现的进度条方法 在 PHP 中实现进度条通常可以通过命令行脚本(CLI)或 Web 页面两种方式完成。以下是几种常见的实现方法: 命令行进度条 使用 PHP CLI 实现进度条,可以通过不…

无限分类实现 php

无限分类实现 php

无限分类的实现方法 无限分类通常用于构建多层级结构的数据,如商品分类、部门架构等。以下是几种常见的实现方式: 邻接列表模式(Adjacency List) 邻接列表是最简单的实现方式,通过在每个记录…

php实现https

php实现https

PHP 实现 HTTPS 请求 在 PHP 中实现 HTTPS 请求,可以通过多种方式完成,包括使用内置函数、cURL 扩展或第三方库。以下是几种常见的方法: 使用 file_get_content…