堆排序

堆排序(重要)

前言: 时间复杂度为O(N*logN),额外空间复杂度为O(1).

  1. 二叉树: 二叉树就是一棵特殊的树,即每一个节点只有两个子节点.

  2. 满二叉树: 首先它是一个二叉树,如果这个二叉树的每一个层的结点数都达到最大值(或者理解为除了最下面一层没有任何子节点以外,其它所有层都是满满当当的二叉树),则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K(K从1开始),且结点总数是(2^k) -1 ,则它就是满二叉树,从形状上看,满二叉树就是一个完整的三角形.

    1. 叶结点: 当一个节点没有左节点和右节点的时候,这个节点就叫叶子节点.
  3. 完全二叉树: 若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。还有一种理解就是,如果除了最后一层和倒数第二层不满,其它层都是满的,并且最后这两层的节点都是从左到右依次补齐的,这个这个…大家画个例子就容易理解了,我也说不清楚了,大家百度一下哈哈哈.

  4. 二叉树其实是可以和数组对应起来的,我们可以通过数组在脑子里脑补出来它对应的完全二叉树结构,如图所示.
    二叉树与数组对应的图.

  5. 堆(就是完全二叉树)

    1. 大根堆: 在这棵完全二叉树中,整棵树的最大值就是这棵树的根节点(也可以理解为它的头,反正就是最上面那一个节点),这个规则对于它的左右子树也同样成立,如[6,5,4,3,4],根据我上面画的自己脑补一下子哈.
    2. 小根堆: 同理,任何一颗子树(包括整个树)的最小值都是根节点,如[1,2,3,4,5].
    3. 建立一个大根堆的时间复杂度是O(N),因为比如来说第一个数和根节点,也就是自己比较,时间复杂度为log1,第四个数,需要和自己的父节点和父节点的父节点比较,也就是要比较两次,即log(4),所以N个数的时间复杂度为: log(1) + log(2) +…+log(N) = O(N).
  6. 堆排序过程(以[3,5,4,5,6]为例)

    1. 让数组变成大根堆,即[6,5,4,5,3].
    2. 把大根堆的最后一个位置和堆顶位置做交换,同时让堆的大小减一,此时,大根堆的根节点,也就是本数组中的最大值6就固定在数组最后一个数不动了.
    3. 让数组从0array.length - 2(也就是大根堆的长度,本来是减1,但是因为刚才6放下来又减1了)重新建立大根堆,就变成了[5,5,4,3,6].
    4. 然后又把大根堆第一个位置5的数和最后一个位置的数3,注意是3,不是6交换,再重复步骤3…循环往复.
    5. 当最后大根堆中只有一个元素就停止,此时数组就有序了,即[3,4,5,5,6].
    6. 堆排序代码.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值