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);     
  • 相关阅读:
    tf.contrib.layers.fully_connected参数笔记
    关于RNN(Recurrent Neural Network)的一篇文章
    tf.contrib.rnn.LSTMCell 里面参数的意义
    机器学习笔记——k-近邻算法(一)简单代码
    labview2016崩溃解决方案
    tecplot 插值问题
    网络设备
    tcp
    udp
    icmp
  • 原文地址:https://www.cnblogs.com/sailrancho/p/3450799.html
Copyright © 2011-2022 走看看