• 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);     
  • 相关阅读:
    课程的添加与发布
    openlayers 框选得到在选框内的要素,并标注出这些要素的名称
    手写js前端分页功能实现
    eclipse安装html编辑器插件
    Redis持久化技术
    java获取指定时间
    java生成Cron表达式
    CentOS7 ifcfg-ens33(没有eth0网卡) 网卡配置 静态IP地址
    java代码关闭tomcat程序
    Tomcat控制台乱码问题
  • 原文地址:https://www.cnblogs.com/sailrancho/p/3450799.html
Copyright © 2020-2023  润新知