PHP排序算法之堆排序(Heap Sort)实例详解
1. 什么是堆排序?
堆排序是一种基于比较的排序算法,利用堆这种数据结构来实现,堆是一种特殊的完全二叉树,分为最大堆和最小堆,在最大堆中,每个节点的值都大于或等于其子节点的值;在最小堆中,每个节点的值都小于或等于其子节点的值,堆排序通常使用最大堆来进行升序排序,使用最小堆来进行降序排序。
2. 堆排序的基本步骤
堆排序可以分为两个主要步骤:
1、构建初始堆:将无序数组构建成一个最大堆。
2、排序过程:反复将堆顶元素(最大值)与堆的最后一个元素交换,然后重新调整堆,直到整个数组有序。
3. 代码实现
1 构建最大堆
function buildMaxHeap(&$arr, $n) { for ($i = floor($n / 2) 1; $i >= 0; $i) { heapify($arr, $n, $i); } } 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); } }
2 堆排序主函数
function heapSort(&$arr) { $n = count($arr); // 构建最大堆 buildMaxHeap($arr, $n); // 一个接一个地从堆中取出元素 for ($i = $n 1; $i >= 0; $i) { // 移动当前根到末尾 $temp = $arr[0]; $arr[0] = $arr[$i]; $arr[$i] = $temp; // 调用heapify来减少堆的大小并重新构建堆 heapify($arr, $i, 0); } }
3 测试代码
$arr = [12, 11, 13, 5, 6, 7]; heapSort($arr); echo "Sorted array is \n"; print_r($arr);
4. 示例输出
Sorted array is Array ( [0] => 5 [1] => 6 [2] => 7 [3] => 11 [4] => 12 [5] => 13 )
5. 相关问题与解答
Q1: 堆排序的时间复杂度是多少?
A1: 堆排序的时间复杂度为O(n log n),其中n是数组的长度,这是因为构建初始堆需要O(n)时间,而每次从堆中取出元素并重新调整堆需要O(log n)时间,总共需要进行n次这样的操作。
Q2: 堆排序的空间复杂度是多少?
A2: 堆排序的空间复杂度为O(1),因为它是一个原地排序算法,不需要额外的存储空间。
以上就是关于“PHP排序算法之堆排序(Heap Sort)实例详解”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!