Example #1
0
/**
 * 堆排序
 * 基本思想:
 * 堆排序(HeapSort)是一树形选择排序。
 * 在排序过程中,将R[l..n]看成是一棵完全二叉树的顺序存储结构,
 * 利用完全二叉树中双亲结点和孩子结点之间的内在关系,
 * 在当前无序区中选择关键字最大(或最小)的记录。
 *  
 * 根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最小者的堆称为小根堆。
 * 根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,称为大根堆。
 */
function heapSort(array $list)
{
    $length = count($list);
    buildHeap($list, $length - 1);
    while (--$length) {
        $temp = $list[0];
        $list[0] = $list[$length];
        $list[$length] = $temp;
        heapAdjust($list, 0, $length);
    }
    return $list;
}
/**
 * Função de ordenação
 * @param array $vetor
 */
function heapSort(&$vetor)
{
    for ($i = (int) ((count($vetor) - 1) / 2); $i >= 0; $i--) {
        $count = count($vetor) - 1;
        buildHeap($vetor, $i, $count);
    }
    for ($i = count($vetor) - 1; $i >= 1; $i--) {
        $aux = $vetor[0];
        $vetor[0] = $vetor[$i];
        $vetor[$i] = $aux;
        buildHeap($vetor, 0, $i - 1);
    }
}