PHP 堆与堆排序
堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法。学习堆排序前,先讲解下什么是数据结构中的二叉堆。
PHP 堆管理代码如下:
<?php class heep{ static function add(&$arr,$one){ $arr[] = $one; self::up($arr,count($arr) -1); } // 下沉 static function del(&$arr){ $arr[0] = array_pop($arr); self::down($arr,0,count($arr)-1); } static function swap(&$arr,$i,$p){ $tmp = $arr[$i]; $arr[$i] = $arr[$p]; $arr[$p] = $tmp; } // 增加元素 上浮 static function up(&$arr,$i){ $p = floor(($i-1)/2); while( $p >= 0 && $i > 0 && $arr[$p] > $arr[$i] ){ self::swap($arr,$i,$p); $i = $p; $p = floor(($i-1)/2); } } // 下沉 $i开始 $n结束 static function down(&$arr,$i,$n){ $l = 2*$i + 1; while( $l <= $n ){ if( $l+1 <= $n && $arr[$l+1]<$arr[$l]) $l ++; if( $arr[$l] > $arr[$i] ) break; self::swap($arr,$i,$l); $i = $l; $l = 2*$i + 1; } } // 将数组变成堆 static function make(&$arr){ $n = count( $arr )-1; for ($i = $n / 2 - 1; $i >= 0; $i--) self::down($arr,$i,$n); } // 将堆进行排序 static function sort(&$arr){ $n = count( $arr )-1; for ( $i=$n; $i >= 0; $i--){ self::swap($arr,0,$i); self::down($arr,0,$i-1); } } } $arr = [10,40,30]; $arr = array(); heep::add($arr,40); heep::add($arr,10); heep::add($arr,30); heep::add($arr,15); heep::add($arr,8); heep::add($arr,50); heep::add($arr,20); heep::add($arr,3); echo join(',',$arr),'<br>'; heep::del($arr); heep::del($arr); heep::del($arr); echo join(',',$arr),'<br>'; heep::sort($arr); echo join(',',$arr),'<br>'; $arr = [40,10,30]; heep::make($arr); echo join(',',$arr),'<br>';