php实现堆排序

阅读更多
先上堆排序代码:
= 0; $index--) {
        max_heapify($arr, $index, $len);
    }
    
    // 推排序是很有规律的,先找出最大值,放到堆的最后,然后假装堆的结点数减少,
    // 继续排序,找出次大的,等等。
    // 巧妙利用堆和数组的映射,实现排序。
    for ($index = $len - 1; $index > 0; $index--) {
        $arr = swap ( $arr, 0, $index );
        max_heapify($arr, 0, $index);
    }
    return $arr;
}

/**
 * 堆排序核心算法,
 * 对于一个给定的堆,给定的起始下标和结束下标,进行堆排序,会递归调用。
 * 事实上,只排序起始下标指向的父节点,结束下标仅仅用于递归判断的返回。
 * 这是指针形式的调用,这样的话,代码速度快,且代码容易理解。
 * 
 * @param array $arr
 * @param int $start_index
 * @param int $end_index
 */
function max_heapify(&$arr, $start_index, $end_index) {
    //建立父節點指標和子節點指標
    $dad_index = $start_index;
    $son_index = $dad_index * 2 + 1;
    //若子節點指標超過範圍直接跳出函數
    if ($son_index >= $end_index) {
        return;
    }
    //先比較兩個子節點大小,選擇最大的
    if ($son_index + 1 < $end_index && $arr[$son_index] < $arr[$son_index + 1]) {
        $son_index++;
    }
    //如果父節點小於子節點時,交換父子內容再繼續子節點和孫節點比較
    if ($arr[$dad_index] < $arr[$son_index]) {
        $arr = swap($arr, $dad_index, $son_index);
        max_heapify($arr, $son_index, $end_index);
    }
}

/**
 * 交换一个数组中两个不同下标的值。
 * @param array $arr
 * @param int $index1
 * @param int $index2
 * @return array
 */
function swap($arr, $index1, $index2) {
    list( $arr[$index1], $arr[$index2] ) = [ $arr[$index2], $arr[$index1] ];
    return $arr;
}


其实可以看到,堆排序代码并不算多,关键在于理解。

本文有参考:http://bubkoo.com/2014/01/14/sort-algorithm/heap-sort/
作者不知是谁,描述的很清楚。

  • 堆是一棵二叉数。
  • 堆是一棵完全二叉数,于是,堆可以轻松用数组表达
  • 假设下标是i,则父节点和子节点都有下标计算公式。
  • 堆排序算法是先初始化成最大堆,然后交换堆顶和堆最后结点,然后结点数减1,再依次操作,就排序好了。


下图仅供参考,注意开始已经初始化过最大堆了。

php实现堆排序_第1张图片



  • php实现堆排序_第2张图片
  • 大小: 299.2 KB
  • 查看图片附件

你可能感兴趣的:(php,堆排序)