PHP堆排序(大顶堆)

话说从 PHP5.3.0 开始 SPL 标准库支持 SplHeap 、SplMinHeap 、SplMaxHeap 这三种堆结构 , 不知道是不是这些数据结构中是不是都是最精简的数据类型 ? 如果是 , 那么 PHP 自写的堆排序耗时就应该和系统函数 Sort 效率相当 . 当然我没测试过 , 我估计 , 类似于 SplFixedArray 仅仅是定长的 PHP ARRAY 吧 , 和 C 里面那个 ARRAY 还是不搭边 .


不过甭管结构到底咋样吧 , 这并不影响 PHP 程序们学习优秀思想的热情 .

上代码啵 .

// 交换
function swap(& $a, & $b) {
  $temp = $a;
  $a = $b;
  $b = $temp;
}

// 从 $a 的第 $i 个节点开始至 $n 结束 , 递归的将其 ( 包括其子节点 ) 转化为一个小顶堆
function bulidHeap(& $a, $i, $n) {

  // 获取左 / 右节点
  $r = ($l = 2*$i+1)+1;
  $max = $i;
  
  // 如果左子节点大于当前节点 , 那么记录左节点键名
  $i<$n && $l<$n && $a[$i]<$a[$l] && $max = $l;
  // 如果右节点大于刚刚记录的 $max , 那么再次交换
  $i<$n && $r<$n && $a[$max]<$a[$r] && $max = $r;
  
  if($max!==$i && $max<$n){
    swap($a[$i], $a[$max]);
    bulidHeap($a, $max, $n);
  }

}

// 堆化数组
function createHeap(& $a) {
  $l = count($a);
  $i = ceil($l/2);
  for(; $i>=0; $i--) bulidHeap($a, $i, $l);
}

// 堆排序
function heapSort($a){
  createHeap($a);
  $c = count($a);
  while($c>0) {
    /* 这是一个大顶堆 , 所以堆顶的节点必须是最大的
       根据此特点 , 每次都将堆顶数据移到最后一位
       然后对剩余数据节点再次建造堆就可以 */
    swap($a[0], $a[--$c]);
    bulidHeap($a, 0, $c);
  }
  return $a;
}


用法 :

echo(implode(",", heapSort($a)));// 注意 , $a 是一个数组


至此堆排序就写完了 , 欢迎指正批评哈 , 改天有时间去实践一下 Spl 提供的数据结构效率到底咋样 . - -

你可能感兴趣的:(数据结构,算法,堆排序)