php实现堆排序

$arr = [9, 43, 12, 0, 87, 1];
function swap(&$arr, $i, $j){
    $tmp = $arr[$i];
    $arr[$i] = $arr[$j];
    $arr[$j] = $tmp;
}
//merge_sort($arr);
function heap_sort(&$arr){
    $len = count($arr) -1;
    $m = intval($len/2);
    //先构建一个大顶堆
    for($i = $m; $i >= 0; $i--){
        heap_adjust($arr, $i, $len);
    }
    //
    for($i = $len; $i > 0; $i--){
        echo "$i";
        swap($arr, 0, $i);
        heap_adjust($arr, 0, $i -1);
    }
}
/*
*$arr的$start+1到$end之间是一个大顶堆,新加的第一个元素,让这个元素从新成为一个大顶堆
*/
function heap_adjust(&$arr, $start, $end){
    if($start >= $end){
        return;
    }
    $tmp = $arr[$start];
    $i = $start;
    for($j = 2 * $start; $j <= $end; $j *=2 ){
        if($j+1 <= $end && $arr[$j+1] > $arr[$j]){
            $j++;
        }
        if($arr[$j] < $tmp){
            break;
        }
        $arr[$i] = $arr[$j];
        $i = $j;
    }
    $arr[$i] = $tmp;
}
heap_sort($arr);
var_export($arr);

 

posted @ 2016-05-02 18:04  天空中的蜂蜂  阅读(189)  评论(0编辑  收藏  举报