美文网首页
堆 -(堆构建及堆排序)

堆 -(堆构建及堆排序)

作者: designer | 来源:发表于2022-01-03 11:42 被阅读0次

堆(英语:heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。

1.堆的性质:
1.堆中某个节点的值总是不大于(大顶堆)或不小于(小顶堆)其父节点的值。
2.堆总是一棵完全二叉树。
2.大顶堆构造案例:
<?php
/**
 * @Author: fql
 * @Email: fangqiulin4923@gmail.com
 * @Date: 2020-07-19 22:41
 */

namespace fql\algorithm\sort;

use fql\sort\Sort;

/**
 * Class Heap
 * @package fql\structure
 * 堆性质:1.对于任何节点,如果节点序号为i,则其左节点为2*i+1,其右节点序号为:2*i+2
 *       2.堆的最后一个非叶子节点若只有左孩子,则:2*i+1 = n-1 =>i=n/2-1
 *       3.堆的最后一个非叶子节点有左右两个孩子, 则:2*i+1 = n-2 或者  2*i+2 = n-1 =>i=(n-3)/2,向下取整,可得到:i=n/2-1
 *       4.不稳定排序,内排序
 *       5.时间复杂度:n*log(n)
 */
class HeapSort extends Sort
{
    public function sort(&$array){
        //数组长度
        $len = count($array);
        //进行n趟,每趟数组长度减少1
        for($n = $len ; $n>0; $n--){
            //最后一个非叶子节点
            $node = floor($n/2)-1;
            $this->adjust($array,$node,$n);
            //互换首尾
            $tmp = $array[0];
            $array[0] = $array[$n - 1];
            $array[$n - 1]= $tmp;
        }
        print_r($array);
    }

    /**
     * @param $array
     * @param $node
     * 调整每个节点的位置
     */
    public  function  adjust(&$array,$node,$n){
        if($node < 0){
            return $array;
        }
        $left = 2 * $node + 1;
        $right = 2 * $node + 2;
        //无右节点
        if($right >= $n){
            //父节点和左节点比较
            $this->swap($array,$node, $left);
        }else{
            //父节点和左节点比较
            $this->swap($array,$node, $left);
            //父节点和右节点比较
            $this->swap($array,$node, $right);
        }
        $node--;
        $this->adjust($array,$node,$n);

    }


    protected function swap(&$array,$i,$j){
        if($array[$i] < $array[$j]){
            $tmp = $array[$i];
            $array[$i] = $array[$j];
            $array[$j] = $tmp;
        }
    }
}

相关文章

  • 堆 -(堆构建及堆排序)

    堆(英语:heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。 1.堆的性质...

  • 堆 - 堆和堆排序

    什么是堆 堆是一种特殊的树,它有两个特点: 堆是一个完全二叉树 堆中每个节点的值都必须大于等于(或小于等于)其子树...

  • 图解堆结构、堆排序及堆的应用

    前言 上一次我们介绍了选择类排序中的简单选择排序,简单归简单,但是时间复杂度是O(n^2),这次我们介绍另一种时间...

  • C语言——堆排序

    堆排序的过程可分为三个步骤: 维持堆的性质(这里指最大堆) 构建最大堆 (采用自底向上构建) 排序(将根节点值与堆...

  • 堆&堆排序

    堆排序 堆排序是一种原地的、时间复杂度为 O(nlogn) 的排序算法。 什么是堆 堆是一个完全二叉树(除了最后一...

  • 堆排序的堆类 --- Javascript实现

    堆排序 最大堆(儿子皆小于双亲) 最小堆(双亲皆小于儿子) 堆建立 构建堆调整函数(调整范围,索引以下的部分,至少...

  • python实现堆排序(HeapSort)

    python实现【堆排序】(HeapSort) 算法原理及介绍 堆排序(Heapsort)是指利用堆这种数据结构所...

  • 堆排序

    堆排序 堆排序的核心思想:借助堆数据结构,不断输出当前堆顶元素,每次堆顶离开当前堆后,对剩余元素重新调整成堆,直到...

  • PHP算法系列教程(三)-堆排序

    PHP算法系列教程(三)-堆排序 介绍 要介绍堆排序我们就要先了解什么是堆. 什么是堆 堆(二叉堆)可以视为一棵完...

  • 树结构入门教程-赫夫曼树

    前面我们学习了堆排序,关于堆排序就两点需要我们清楚,ruguoxuqiu如果是升序操作,我们需要构建大顶堆,如果是...

网友评论

      本文标题:堆 -(堆构建及堆排序)

      本文链接:https://www.haomeiwen.com/subject/jyjxcrtx.html