百然 發表於 2020-3-11 18:01:00

PHP常用算法

<p><span style="font-size: 14px"><strong>一、冒泡排序</strong></span></p>
<p><span style="font-size: 14px"><strong>基本思想:</strong></span></p>
<p><span style="font-size: 14px">对需要排序的数组从后往前(逆序)进行多遍的扫描,当发现相邻的两个数值的次序与排序要求的规则不一致时,就将这两个数值进行交换。这样比较小(大)的数值就将逐渐从后面向前面移动。</span></p>
<div>
<div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">代码利用了双循环来实现排序。 外循环用来控制所有轮次,内循环用来控制每一轮的排序</span>
<span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(128, 0, 128, 1)">$i</span> = 0; <span style="color: rgba(128, 0, 128, 1)">$i</span> &lt; <span style="color: rgba(0, 128, 128, 1)">count</span>(<span style="color: rgba(128, 0, 128, 1)">$sortArr</span>) - 1; <span style="color: rgba(128, 0, 128, 1)">$i</span>++<span style="color: rgba(0, 0, 0, 1)">) {
  </span><span style="color: rgba(128, 0, 128, 1)">$isChange</span> = <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(128, 0, 128, 1)">$j</span> = <span style="color: rgba(128, 0, 128, 1)">$i</span> + 1; <span style="color: rgba(128, 0, 128, 1)">$j</span> &lt; <span style="color: rgba(0, 128, 128, 1)">count</span>(<span style="color: rgba(128, 0, 128, 1)">$sortArr</span>); <span style="color: rgba(128, 0, 128, 1)">$j</span>++<span style="color: rgba(0, 0, 0, 1)">) {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$sortArr</span>[<span style="color: rgba(128, 0, 128, 1)">$i</span>] &gt; <span style="color: rgba(128, 0, 128, 1)">$sortArr</span>[<span style="color: rgba(128, 0, 128, 1)">$j</span><span style="color: rgba(0, 0, 0, 1)">]) {
            </span><span style="color: rgba(128, 0, 128, 1)">$temp</span> = <span style="color: rgba(128, 0, 128, 1)">$sortArr</span>[<span style="color: rgba(128, 0, 128, 1)">$i</span><span style="color: rgba(0, 0, 0, 1)">];
            </span><span style="color: rgba(128, 0, 128, 1)">$sortArr</span>[<span style="color: rgba(128, 0, 128, 1)">$i</span>] = <span style="color: rgba(128, 0, 128, 1)">$sortArr</span>[<span style="color: rgba(128, 0, 128, 1)">$j</span><span style="color: rgba(0, 0, 0, 1)">];
            </span><span style="color: rgba(128, 0, 128, 1)">$sortArr</span>[<span style="color: rgba(128, 0, 128, 1)">$j</span>] = <span style="color: rgba(128, 0, 128, 1)">$temp</span><span style="color: rgba(0, 0, 0, 1)">;
       </span><span style="color: rgba(128, 0, 128, 1)">$isChange</span> = <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">; 
      }
    }
  </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">假如所有数列都是有序的,那么第一轮第一次排序之后所有数列没有发生一次交换,这时候其实已经可以不用再继续后面的循环了</span>
  <span style="color: rgba(0, 0, 255, 1)">if</span>(!<span style="color: rgba(0, 0, 0, 1)">isChange){
    </span><span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
  }
} </span></pre>
</div>
</div>
</div>
<p><span style="font-size: 14px"><strong>二、快速排序</strong></span></p>
<p><span style="font-size: 14px"><strong>基本思想:</strong></span></p>
<p><span style="font-size: 14px">在数组中挑出一个元素(多为第一个)作为标尺,扫描一遍数组将比标尺小的元素排在标尺之前,将所有比标尺大的元素排在标尺之后,通过递归将各子序列分别划分为更小的序列直到所有的序列顺序一致。</span></p>
<div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">//快速排序
</span><span style="color: rgba(0, 0, 255, 1)">function</span> quickSort(<span style="color: rgba(128, 0, 128, 1)">$arr</span><span style="color: rgba(0, 0, 0, 1)">)
{
    </span><span style="color: rgba(128, 0, 128, 1)">$len</span> = <span style="color: rgba(0, 128, 128, 1)">count</span>(<span style="color: rgba(128, 0, 128, 1)">$arr</span><span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$len</span> &lt;= 1<span style="color: rgba(0, 0, 0, 1)">) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$arr</span><span style="color: rgba(0, 0, 0, 1)">;
    }

    </span><span style="color: rgba(128, 0, 128, 1)">$v</span> = <span style="color: rgba(128, 0, 128, 1)">$arr</span>;
    </span><span style="color: rgba(128, 0, 128, 1)">$low</span> = <span style="color: rgba(128, 0, 128, 1)">$up</span> = <span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">();
    </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(128, 0, 128, 1)">$i</span> = 1; <span style="color: rgba(128, 0, 128, 1)">$i</span> &lt; <span style="color: rgba(128, 0, 128, 1)">$len</span>; ++<span style="color: rgba(128, 0, 128, 1)">$i</span><span style="color: rgba(0, 0, 0, 1)">) {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$arr</span>[<span style="color: rgba(128, 0, 128, 1)">$i</span>] &gt; <span style="color: rgba(128, 0, 128, 1)">$v</span><span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(128, 0, 128, 1)">$up</span>[] = <span style="color: rgba(128, 0, 128, 1)">$arr</span>[<span style="color: rgba(128, 0, 128, 1)">$i</span><span style="color: rgba(0, 0, 0, 1)">];
      } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(128, 0, 128, 1)">$low</span>[] = <span style="color: rgba(128, 0, 128, 1)">$arr</span>[<span style="color: rgba(128, 0, 128, 1)">$i</span><span style="color: rgba(0, 0, 0, 1)">];
      }
    }
    </span><span style="color: rgba(128, 0, 128, 1)">$low</span> = quickSort(<span style="color: rgba(128, 0, 128, 1)">$low</span><span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(128, 0, 128, 1)">$up</span> = quickSort(<span style="color: rgba(128, 0, 128, 1)">$up</span><span style="color: rgba(0, 0, 0, 1)">);

    </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 128, 128, 1)">array_merge</span>(<span style="color: rgba(128, 0, 128, 1)">$low</span>, <span style="color: rgba(0, 0, 255, 1)">array</span>(<span style="color: rgba(128, 0, 128, 1)">$v</span>), <span style="color: rgba(128, 0, 128, 1)">$up</span><span style="color: rgba(0, 0, 0, 1)">);
}

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">快速排序第二种方法</span>
<span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(128, 0, 128, 1)">$i</span> = 0; <span style="color: rgba(128, 0, 128, 1)">$i</span> &lt; <span style="color: rgba(0, 128, 128, 1)">count</span>(<span style="color: rgba(128, 0, 128, 1)">$sortArr</span>) - 1; <span style="color: rgba(128, 0, 128, 1)">$i</span>++<span style="color: rgba(0, 0, 0, 1)">) {
    </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(128, 0, 128, 1)">$j</span> = <span style="color: rgba(0, 128, 128, 1)">count</span>(<span style="color: rgba(128, 0, 128, 1)">$sortArr</span>) - 1; <span style="color: rgba(128, 0, 128, 1)">$j</span> &gt; <span style="color: rgba(128, 0, 128, 1)">$i</span>; <span style="color: rgba(128, 0, 128, 1)">$j</span>--<span style="color: rgba(0, 0, 0, 1)">) {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$sortArr</span>[<span style="color: rgba(128, 0, 128, 1)">$i</span>] &gt; <span style="color: rgba(128, 0, 128, 1)">$sortArr</span>[<span style="color: rgba(128, 0, 128, 1)">$j</span><span style="color: rgba(0, 0, 0, 1)">]) {
            </span><span style="color: rgba(128, 0, 128, 1)">$temp</span>      = <span style="color: rgba(128, 0, 128, 1)">$sortArr</span>[<span style="color: rgba(128, 0, 128, 1)">$i</span><span style="color: rgba(0, 0, 0, 1)">];
            </span><span style="color: rgba(128, 0, 128, 1)">$sortArr</span>[<span style="color: rgba(128, 0, 128, 1)">$i</span>] = <span style="color: rgba(128, 0, 128, 1)">$sortArr</span>[<span style="color: rgba(128, 0, 128, 1)">$j</span><span style="color: rgba(0, 0, 0, 1)">];
            </span><span style="color: rgba(128, 0, 128, 1)">$sortArr</span>[<span style="color: rgba(128, 0, 128, 1)">$j</span>] = <span style="color: rgba(128, 0, 128, 1)">$temp</span><span style="color: rgba(0, 0, 0, 1)">;
      }
    }
}</span></pre>
</div>
</div>
<p>&nbsp;</p>
<p><span style="font-size: 14px"><strong>三、二分查找</strong></span></p>
<p><span style="font-size: 14px"><strong>基本思想:</strong></span></p>
<p><span style="font-size: 14px">假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。(数据量大的时候使用)</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组</span><span style="color: rgba(0, 128, 0, 1)">
/*</span><span style="color: rgba(0, 128, 0, 1)">*
* 二分查找法(数组中查找某个元素)
* @param array $arr 要查找的数组
* @param int $low 查找的起始位置
* @param array $high 查找的结束位置
* @param mixed $k 要查找的目标值
* @return int 存在此值返回key,不存在返回-1
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>

<span style="color: rgba(0, 0, 255, 1)">function</span> bin_search(<span style="color: rgba(128, 0, 128, 1)">$arr</span>,<span style="color: rgba(128, 0, 128, 1)">$low</span>,<span style="color: rgba(128, 0, 128, 1)">$high</span>,<span style="color: rgba(128, 0, 128, 1)">$k</span><span style="color: rgba(0, 0, 0, 1)">)
{
    </span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(128, 0, 128, 1)">$low</span> &lt;= <span style="color: rgba(128, 0, 128, 1)">$high</span><span style="color: rgba(0, 0, 0, 1)">)
    {
      </span><span style="color: rgba(128, 0, 128, 1)">$mid</span> = <span style="color: rgba(0, 128, 128, 1)">intval</span>((<span style="color: rgba(128, 0, 128, 1)">$low</span> + <span style="color: rgba(128, 0, 128, 1)">$high</span>)/2<span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(128, 0, 128, 1)">$arr</span>[<span style="color: rgba(128, 0, 128, 1)">$mid</span>] == <span style="color: rgba(128, 0, 128, 1)">$k</span><span style="color: rgba(0, 0, 0, 1)">)
      {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$mid</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(128, 0, 128, 1)">$k</span> &lt; <span style="color: rgba(128, 0, 128, 1)">$arr</span>[<span style="color: rgba(128, 0, 128, 1)">$mid</span><span style="color: rgba(0, 0, 0, 1)">])
      {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> bin_search(<span style="color: rgba(128, 0, 128, 1)">$arr</span>,<span style="color: rgba(128, 0, 128, 1)">$low</span>,<span style="color: rgba(128, 0, 128, 1)">$mid</span>-1,<span style="color: rgba(128, 0, 128, 1)">$k</span><span style="color: rgba(0, 0, 0, 1)">);
      }
      </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">
      {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> bin_search(<span style="color: rgba(128, 0, 128, 1)">$arr</span>,<span style="color: rgba(128, 0, 128, 1)">$mid</span>+1,<span style="color: rgba(128, 0, 128, 1)">$high</span>,<span style="color: rgba(128, 0, 128, 1)">$k</span><span style="color: rgba(0, 0, 0, 1)">);
      }
    }
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> -1<span style="color: rgba(0, 0, 0, 1)">;
}

</span><span style="color: rgba(128, 0, 128, 1)">$arr</span> = <span style="color: rgba(0, 0, 255, 1)">array</span>(1,2,3,4,5,6,7,8,9,10<span style="color: rgba(0, 0, 0, 1)">);

</span><span style="color: rgba(0, 0, 255, 1)">print</span>(bin_search(<span style="color: rgba(128, 0, 128, 1)">$arr</span>,0,9,3)); </pre>
</div>
<p><span style="font-size: 14px"><strong>四、顺序查找</strong></span></p>
<p><span style="font-size: 14px"><strong>基本思想:</strong></span></p>
<p><span style="font-size: 14px">从数组的第一个元素开始一个一个向下查找,如果有和目标一致的元素,查找成功;如果到最后一个元素仍没有目标元素,则查找失败。</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* 顺序查找(数组里查找某个元素)
* @param array $array 要查找的数组
* @param array $n 查找的结束位置 + 1
* @param mixed $target 要查找的目标值
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">function</span> seq_sch(<span style="color: rgba(128, 0, 128, 1)">$array</span>, <span style="color: rgba(128, 0, 128, 1)">$n</span>, <span style="color: rgba(128, 0, 128, 1)">$target</span><span style="color: rgba(0, 0, 0, 1)">)
{
    </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(128, 0, 128, 1)">$i</span> = 0; <span style="color: rgba(128, 0, 128, 1)">$i</span> &lt; <span style="color: rgba(128, 0, 128, 1)">$n</span>; <span style="color: rgba(128, 0, 128, 1)">$i</span>++<span style="color: rgba(0, 0, 0, 1)">) {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$array</span>[<span style="color: rgba(128, 0, 128, 1)">$i</span>] == <span style="color: rgba(128, 0, 128, 1)">$target</span><span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
      }
    }
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$i</span> &lt; <span style="color: rgba(128, 0, 128, 1)">$n</span><span style="color: rgba(0, 0, 0, 1)">) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$i</span><span style="color: rgba(0, 0, 0, 1)">;
    } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> -1<span style="color: rgba(0, 0, 0, 1)">;
    }
}

</span><span style="color: rgba(128, 0, 128, 1)">$array</span> = ;
</span><span style="color: rgba(128, 0, 128, 1)">$find</span> = seq_sch(<span style="color: rgba(128, 0, 128, 1)">$array</span>, <span style="color: rgba(0, 128, 128, 1)">count</span>(<span style="color: rgba(128, 0, 128, 1)">$array</span>), 89<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">var_dump</span>(<span style="color: rgba(128, 0, 128, 1)">$find</span>);</pre>
</div>
<h3><span style="font-size: 14px">五<strong>、</strong>选择排序</span></h3>
<p><span style="font-size: 14px"><strong>基本思想:</strong>在要排序的一组数中,选出最小的一个数与第一个位置的数交换。然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。</span></p>
<p><span style="font-size: 14px"><strong>代码实现:</strong></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">function</span> selectSort(<span style="color: rgba(128, 0, 128, 1)">$arr</span><span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">双重循环完成,外层控制轮数,内层控制比较次数</span>
<span style="color: rgba(128, 0, 128, 1)">$len</span>=<span style="color: rgba(0, 128, 128, 1)">count</span>(<span style="color: rgba(128, 0, 128, 1)">$arr</span><span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 0, 255, 1)">for</span>(<span style="color: rgba(128, 0, 128, 1)">$i</span>=0; <span style="color: rgba(128, 0, 128, 1)">$i</span>&lt;<span style="color: rgba(128, 0, 128, 1)">$len</span>-1; <span style="color: rgba(128, 0, 128, 1)">$i</span>++<span style="color: rgba(0, 0, 0, 1)">) {
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">先假设最小的值的位置</span>
      <span style="color: rgba(128, 0, 128, 1)">$p</span> = <span style="color: rgba(128, 0, 128, 1)">$i</span><span style="color: rgba(0, 0, 0, 1)">;
      
      </span><span style="color: rgba(0, 0, 255, 1)">for</span>(<span style="color: rgba(128, 0, 128, 1)">$j</span>=<span style="color: rgba(128, 0, 128, 1)">$i</span>+1; <span style="color: rgba(128, 0, 128, 1)">$j</span>&lt;<span style="color: rgba(128, 0, 128, 1)">$len</span>; <span style="color: rgba(128, 0, 128, 1)">$j</span>++<span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">$arr[$p] 是当前已知的最小值</span>
            <span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(128, 0, 128, 1)">$arr</span>[<span style="color: rgba(128, 0, 128, 1)">$p</span>] &gt; <span style="color: rgba(128, 0, 128, 1)">$arr</span>[<span style="color: rgba(128, 0, 128, 1)">$j</span><span style="color: rgba(0, 0, 0, 1)">]) {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">比较,发现更小的,记录下最小值的位置;并且在下次比较时采用已知的最小值进行比较。</span>
                <span style="color: rgba(128, 0, 128, 1)">$p</span> = <span style="color: rgba(128, 0, 128, 1)">$j</span><span style="color: rgba(0, 0, 0, 1)">;
            }
      }
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">已经确定了当前的最小值的位置,保存到$p中。如果发现最小值的位置与当前假设的位置$i不同,则位置互换即可。</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(128, 0, 128, 1)">$p</span> != <span style="color: rgba(128, 0, 128, 1)">$i</span><span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(128, 0, 128, 1)">$tmp</span> = <span style="color: rgba(128, 0, 128, 1)">$arr</span>[<span style="color: rgba(128, 0, 128, 1)">$p</span><span style="color: rgba(0, 0, 0, 1)">];
            </span><span style="color: rgba(128, 0, 128, 1)">$arr</span>[<span style="color: rgba(128, 0, 128, 1)">$p</span>] = <span style="color: rgba(128, 0, 128, 1)">$arr</span>[<span style="color: rgba(128, 0, 128, 1)">$i</span><span style="color: rgba(0, 0, 0, 1)">];
            </span><span style="color: rgba(128, 0, 128, 1)">$arr</span>[<span style="color: rgba(128, 0, 128, 1)">$i</span>] = <span style="color: rgba(128, 0, 128, 1)">$tmp</span><span style="color: rgba(0, 0, 0, 1)">;
      }
    }
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">返回最终结果</span>
    <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$arr</span><span style="color: rgba(0, 0, 0, 1)">;
}</span><code class="null"><span style="font-family: &quot;PingFang SC&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; font-size: 14px">&nbsp;</span></code></pre>
</div>
<h3><span style="font-size: 14px">六<strong>、</strong>插入排序</span></h3>
<p><span style="font-size: 14px"><strong>基本思想:</strong>在要排序的一组数中,假设前面的数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。</span></p>
<p><span style="font-size: 14px"><strong>代码实现:</strong></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">function</span> insertSort(<span style="color: rgba(128, 0, 128, 1)">$arr</span><span style="color: rgba(0, 0, 0, 1)">) {
    </span><span style="color: rgba(128, 0, 128, 1)">$len</span>=<span style="color: rgba(0, 128, 128, 1)">count</span>(<span style="color: rgba(128, 0, 128, 1)">$arr</span><span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 0, 255, 1)">for</span>(<span style="color: rgba(128, 0, 128, 1)">$i</span>=1, <span style="color: rgba(128, 0, 128, 1)">$i</span>&lt;<span style="color: rgba(128, 0, 128, 1)">$len</span>; <span style="color: rgba(128, 0, 128, 1)">$i</span>++<span style="color: rgba(0, 0, 0, 1)">) {
      </span><span style="color: rgba(128, 0, 128, 1)">$tmp</span> = <span style="color: rgba(128, 0, 128, 1)">$arr</span>[<span style="color: rgba(128, 0, 128, 1)">$i</span><span style="color: rgba(0, 0, 0, 1)">];
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">内层循环控制,比较并插入</span>
      <span style="color: rgba(0, 0, 255, 1)">for</span>(<span style="color: rgba(128, 0, 128, 1)">$j</span>=<span style="color: rgba(128, 0, 128, 1)">$i</span>-1;<span style="color: rgba(128, 0, 128, 1)">$j</span>&gt;=0;<span style="color: rgba(128, 0, 128, 1)">$j</span>--<span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(128, 0, 128, 1)">$tmp</span> &lt; <span style="color: rgba(128, 0, 128, 1)">$arr</span>[<span style="color: rgba(128, 0, 128, 1)">$j</span><span style="color: rgba(0, 0, 0, 1)">]) {
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">发现插入的元素要小,交换位置,将后边的元素与前面的元素互换</span>
                <span style="color: rgba(128, 0, 128, 1)">$arr</span>[<span style="color: rgba(128, 0, 128, 1)">$j</span>+1] = <span style="color: rgba(128, 0, 128, 1)">$arr</span>[<span style="color: rgba(128, 0, 128, 1)">$j</span><span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(128, 0, 128, 1)">$arr</span>[<span style="color: rgba(128, 0, 128, 1)">$j</span>] = <span style="color: rgba(128, 0, 128, 1)">$tmp</span><span style="color: rgba(0, 0, 0, 1)">;
            } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">如果碰到不需要移动的元素,由于是已经排序好是数组,则前面的就不需要再次比较了。</span>
                <span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
            }
      }
    }
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$arr</span><span style="color: rgba(0, 0, 0, 1)">;
}</span></pre>
</div>
<p>&nbsp;</p>
<p><span style="font-size: 14px"><strong>七、写一个函数,能够遍历一个文件下的所有文件和子文件夹</strong></span></p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 0, 255, 1)">function</span> my_scandir(<span style="color: rgba(128, 0, 128, 1)">$dir</span><span style="color: rgba(0, 0, 0, 1)">)
{
    </span><span style="color: rgba(128, 0, 128, 1)">$files</span> = <span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">();
    </span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(128, 0, 128, 1)">$handle</span> = <span style="color: rgba(0, 128, 128, 1)">opendir</span>(<span style="color: rgba(128, 0, 128, 1)">$dir</span><span style="color: rgba(0, 0, 0, 1)">))
    {
      </span><span style="color: rgba(0, 0, 255, 1)">while</span> ((<span style="color: rgba(128, 0, 128, 1)">$file</span> = <span style="color: rgba(0, 128, 128, 1)">readdir</span>(<span style="color: rgba(128, 0, 128, 1)">$handle</span>))!== <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">)
      {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(128, 0, 128, 1)">$file</span> != '..' &amp;&amp; <span style="color: rgba(128, 0, 128, 1)">$file</span> != '.'<span style="color: rgba(0, 0, 0, 1)">)
      {
          </span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 128, 128, 1)">is_dir</span>(<span style="color: rgba(128, 0, 128, 1)">$dir</span>."/".<span style="color: rgba(128, 0, 128, 1)">$file</span><span style="color: rgba(0, 0, 0, 1)">))
          {
            </span><span style="color: rgba(128, 0, 128, 1)">$files</span>[<span style="color: rgba(128, 0, 128, 1)">$file</span>]=my_scandir(<span style="color: rgba(128, 0, 128, 1)">$dir</span>."/".<span style="color: rgba(128, 0, 128, 1)">$file</span><span style="color: rgba(0, 0, 0, 1)">);
          }
          </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">
          {
            </span><span style="color: rgba(128, 0, 128, 1)">$files</span>[] = <span style="color: rgba(128, 0, 128, 1)">$file</span><span style="color: rgba(0, 0, 0, 1)">;
          }
      }
      }

      </span><span style="color: rgba(0, 128, 128, 1)">closedir</span>(<span style="color: rgba(128, 0, 128, 1)">$handle</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$files</span><span style="color: rgba(0, 0, 0, 1)">;
    }
}

</span><span style="color: rgba(0, 128, 128, 1)">var_dump</span>(my_scandir('../'));&nbsp;</pre>
</div>
<p><strong>八、写一个函数,尽可能高效的从一个标准url中取出文件的扩展名</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">function</span> getExt(<span style="color: rgba(128, 0, 128, 1)">$url</span><span style="color: rgba(0, 0, 0, 1)">)
{
    </span><span style="color: rgba(128, 0, 128, 1)">$arr</span> = <span style="color: rgba(0, 128, 128, 1)">parse_url</span>(<span style="color: rgba(128, 0, 128, 1)">$url</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">parse_url解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分
    //'scheme' =&gt; string 'http' (length=4)
    //'host' =&gt; string 'www.sina.com.cn' (length=15)
    //'path' =&gt; string '/abc/de/fg.php' (length=14)
    //'query' =&gt; string 'id=1' (length=4)</span>
    <span style="color: rgba(128, 0, 128, 1)">$file</span> = <span style="color: rgba(0, 128, 128, 1)">basename</span>(<span style="color: rgba(128, 0, 128, 1)">$arr</span>['path']);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> basename函数返回路径中的文件名部分</span>
    <span style="color: rgba(128, 0, 128, 1)">$ext</span> = <span style="color: rgba(0, 128, 128, 1)">explode</span>('.', <span style="color: rgba(128, 0, 128, 1)">$file</span><span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$ext</span>[<span style="color: rgba(0, 128, 128, 1)">count</span>(<span style="color: rgba(128, 0, 128, 1)">$ext</span>)-1<span style="color: rgba(0, 0, 0, 1)">];
}

</span><span style="color: rgba(0, 0, 255, 1)">print</span>(getExt('http://www.sina.com.cn/abc/de/fg.html.php?id=1'));</pre>
</div>
<p>&nbsp;</p>
<p><strong>九、实现中文字符串截取无乱码的方法</strong></p>
<p>可使用mb_substr,但是需要确保在php.ini中加载了php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函 数的问题。</p><br><br>
来源:https://www.cnblogs.com/xiaobingch/p/12464045.html
頁: [1]
查看完整版本: PHP常用算法