zoukankan      html  css  js  c++  java
  • 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);     
  • 相关阅读:
    .NET的SqlHelper应用代码
    .NET获取客户端的操作系统、IP地址、浏览器版本
    Codevs 3981 动态最大子段和
    洛谷 P3373 【模板】线段树 2
    一些笔记【杂】
    洛谷 P1432 倒水问题
    洛谷 P2324 [SCOI2005]骑士精神
    Codevs 1010 过河卒
    POJ 3278 Catch That Cow
    洛谷P2184 贪婪大陆
  • 原文地址:https://www.cnblogs.com/sailrancho/p/3450799.html
Copyright © 2011-2022 走看看