zoukankan      html  css  js  c++  java
  • 排序算法-堆排序

    ** 思路:** 将待排序的序列构成一个大顶堆,整个序列的最大值就是堆顶的根节点,将其与数组末尾元素交换,此时末尾元素就是最大的值,然后将剩余的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;
        }
    
  • 相关阅读:
    crontab与系统时间不一致
    MySQL构造测试数据
    【SQL优化】SQL优化工具
    mysql case when then 使用
    update没带where,寻找问题的思路
    线程池
    线程理论
    数据共享
    进程池
    管道
  • 原文地址:https://www.cnblogs.com/onlycat/p/10391466.html
Copyright © 2011-2022 走看看