<?php
class MaxHeap
{
private $data;
private $count;
private $capacity;
public function __construct(int $capcity)
{
$this->data = new SplFixedArray($capcity);
$this->count = 0;
$this->capacity = $capcity;
}
public function __destruct()
{
// TODO: Implement __destruct() method.
unset($this->data);
}
public function size()
{
return $this->count;
}
public function isEmpty()
{
return $this->count == 0;
}
public function insert(int $item)
{
$this->data[$this->count + 1] = $item;
$this->count++;
$this->shiftUp($this->count);
}
public function insertH(int $item){
$this->data[$this->count + 1] = $item;
$this->count++;
$this->shiftUpH($this->count);
}
private function shiftUp(int $k)
{
$item = $this->data[$k];
while ($k > 1 && $this->data[$k / 2] < $item) {
//交换优化
//list($this->data[$k], $this->data[$k / 2]) = array($this->data[$k / 2], $this->data[$k]);
$this->data[$k] = $this->data[$k/2];
$k = intval($k / 2);
}
$this->data[$k] = $item;
}
private function shiftUpH(int $k)
{
//$item = $this->data[$k];
while ($k > 1 && $this->data[$k / 2] < $this->data[$k]) {
//交换优化
list($this->data[$k], $this->data[$k / 2]) = array($this->data[$k / 2], $this->data[$k]);
$this->data[$k] = $this->data[$k/2];
$k = intval($k / 2);
}
//$this->data[$k] = $item;
}
private function shiftDown(int $k)
{
while (2 * $k <= $this->count) {
$j = 2 * $k;
if ($j + 1 <= $this->count && $this->data[$j + 1] > $this->data[$j])
$j += 1;
if ($this->data[$k] > $this->data[$j])
break;
list($this->data[$k],$this->data[$j]) = array($this->data[$j],$this->data[$k]);
$k = $j;
}
}
public function extractMax()
{
if ($this->count <= 0)
return;
$ret = $this->data[1];
$this->data[1] = $this->data[$this->count];
unset($this->data[$this->count]);
$this->count--;
$this->shiftDown(1);
return $ret;
}
public function foreachHeap()
{
var_dump($this->data);
}
}
$maxHeap = new MaxHeap(100);
for ($i = 0; $i < 31; $i++)
$arr[] = rand(0, 99);
foreach ($arr as $v)
$maxHeap->insert($v);
$start_time = microtime();
rsort($arr);
$end_time = microtime();
echo $end_time-$start_time;
var_dump($arr);
$start_time = microtime();
while (!$maxHeap->isEmpty()){
$maxHeap->extractMax();
}
$end_time = microtime();
echo $end_time-$start_time;
$maxHeap->foreachHeap();