排序算法-堆排序

** 思路:** 将待排序的序列构成一个大顶堆,整个序列的最大值就是堆顶的根节点,将其与数组末尾元素交换,此时末尾元素就是最大的值,然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中的次小值,如此反复执行,就能得到一个有序序列了

复杂度: O(nlogn)

<?php
    function heapAdjust(&$list, $s, $m){
        $node = $list[$s];
        for($i = 2 * $s; $i < $m; $i *= 2){
            if($i < $m && $list[$i] < $list[$i + 1]){
                $i++;
            }
            if($node >= $list[$i]){
                break;
            }
            $list[$s] = $list[$i];
            $s = $i;
        }
        $list[$s] = $node;
    }
    
    function heapSort($list){
        for($i = intval(count($list) / 2); $i >= 0; $i--){
            heapAdjust($list, $i, count($list));
        }
        for($i = count($list) - 1; $i > 0; $i--){
            $list[$i] ^= $list[0];
            $list[0] ^= $list[$i];
            $list[$i] ^= $list[0];
            heapAdjust($list, 0, $i-1);
        }
        return $list;
    }
原文地址:https://www.cnblogs.com/onlycat/p/10391466.html