• 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);     
  • 相关阅读:
    SplitViewController的简单使用
    ViewController容器
    AnchorPoint 和Position 关系
    __OSX_AVAILABLE_BUT_DEPRECATED
    __OSX_AVAILABLE_STARTING
    UIButton重复点击,重复触发,怎么办
    iOS小技巧:用runtime 解决UIButton 重复点击问题
    FOUNDATION_EXPORT 或#define 或 extern
    nginx第一天
    053-001
  • 原文地址:https://www.cnblogs.com/sailrancho/p/3450799.html
Copyright © 2020-2023  润新知