1 abstract class Heap { 2 protected $elements = array(); 3 protected $n = 0; 4 5 public abstract function insert($element); 6 7 public function isEmpty() { 8 return $this->n==0; 9 } 10 11 public function all(){ 12 return $this->elements; 13 } 14 15 /** 16 * Extract the top value of the heap 17 * 18 */ 19 public function extract() { 20 $element = $this->elements[1]; 21 $this->elements[1] = array_pop($this->elements); 22 $this->n--; 23 $this->siftDown(); 24 return $element; 25 } 26 27 /** 28 * Rearranges the heap after an extraction to keep the heap property 29 */ 30 protected abstract function siftDown(); 31 32 /** 33 * Swap two elements on the elements array 34 * 35 */ 36 protected function swap($x,$y) { 37 $tmp = $this->elements[$x]; 38 $this->elements[$x] = $this->elements[$y]; 39 $this->elements[$y] = $tmp; 40 } 41 } 42 class MinHeap extends Heap { 43 44 public function insert($element) { 45 $this->elements[++$this->n] = $element; 46 for ($i = $this->n; $i > 1 && $this->elements[$i >> 1] > $this->elements[$i]; $i = $i >> 1) 47 $this->swap($i >> 1,$i); 48 } 49 protected function siftDown() { 50 for ($i = 1; ($c = $i * 2) <= $this->n; $i = $c) { 51 //Checks which of the smaller child to compare with the parent 52 if ($c+1 <= $this->n && $this->elements[$c+1] < $this->elements[$c]) 53 $c++; 54 if ($this->elements[$i] < $this->elements[$c]) 55 break; 56 $this->swap($c, $i); 57 } 58 } 59 60 } 61 62 function heapSort($array){ 63 $heap=new MinHeap(); 64 foreach($array as $val){ 65 $heap->insert($val); 66 67 } 68 $arr=array(); 69 while(!$heap->isEmpty()){ 70 $arr[]=$heap->extract(); 71 } 72 return $arr; 73 } 74 $array=array(1,13,8,4,5); 75 $arr=heapSort($array); 76 print_r($arr);