PHP 堆排序实现

在《算法: C语言实现》上看到的写法,很简洁,用PHP实现一把。

<?php
/*
  fixDown实现对某一个节点的向下调整,这里默认的是起始节点为1,方便计算父子节点关系
  注:
  起始节点为1的父子关系: 父节点k, 子节点为2K、2k+1     子节点j, 父节点为 floor(j/2)  floor为向下取整
  起始节点为0的父子关系: 父节点k, 子节点为2K+1, 2k+2   子节点j, 父节点为 floor((j-1)/2) 

  参数$k为调整点位置, $lenth为数组长度,也就是从1起始到最后一个节点的坐标.
*/
function fixDown(&$arr, $k, $lenth)
{
  while(2*$k<=$lenth) {  //只要当前节点有子节点, 就需要继续该循环
        $j = $k*2;
        if ($j<$lenth && $arr[$j]<$arr[$j+1]) $j++;   // 只要子节点有右节点,且右节点比左节点大,那么切换到右节点操作。
        if ($arr[$j] < $arr[$k]) break;  // 如果子节点都没有父节点大, 那么调整结束。
        exch($arr[$j], $arr[$k]);
      $k = $j;
    }
}

function exch(&$a, &$b) {
    $tmp = $a; $a = $b; $b = $tmp;
}

function headSort(&$arr)
{
    $len = count($arr);
    array_unshift($arr, NULL);
    for($i=$len/2;$i>=1;$i--) {
        fixDown($arr, $i, $len);
    }
    while($len>1) {
        exch($arr[1], $arr[$len]);
        fixDown($arr, 1, --$len);
    }
    array_shift($arr);
}
$arr = array(4,6,4,9,2,3);
headSort($arr);     
原文地址:https://www.cnblogs.com/sailrancho/p/3450799.html