龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > php编程 >

php实现的常见排序算法汇总(2)

时间:2014-09-09 02:19来源:网络整理 作者:网络 点击:
分享到:
起始节点为1的父子关系: 父节点k, 子节点为2K、2k+1 子节点j, 父节点为 floor(j/2) floor为向下取整 起始节点为0的父子关系: 父节点k, 子节点为2K+1, 2k+2 子节点

起始节点为1的父子关系: 父节点k, 子节点为2K、2k+1     子节点j, 父节点为 floor(j/2)  floor为向下取整
起始节点为0的父子关系: 父节点k, 子节点为2K+1, 2k+2   子节点j, 父节点为 floor((j-1)/2)

参数$k为调整点位置, $lenth为数组长度,也就是从1起始到最后一个节点的坐标.

<?php
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);
?>

希望本文所述排序算法实例对大家的php程序设计有所帮助。

精彩图集

赞助商链接