高级排序算法____堆排序(广泛应用于大数据量求前n个最大值 或者前n个最小值)

堆排序(看一万遍视频不如自己亲自手撸一次伪代码)

学习堆排序前的预备知识

  1. 二叉树 :至少了解 什么是完全二叉树, 二叉树的节点和左右子节点的关系
  2. 二叉树的BFS(广度优先遍历) 理解即可;
  3. 有一定的数组排序训练
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法[^1] 功能;

初步建立大顶堆伪代码

/**
 *  将数组转换为大顶堆:
 *  伪代码:
 *  Arr: 数组
 *  i  : 数组下标(树的当前节点)
 *  n  : 数组的长度(树的节点数)
 *
 *
 *  MaxHeapDown(Arr , i , n){
 *      //先判断树的节点是否为空(数组下标i是否越界)
 *          //如果越界:
 *          if(i >= n):
 *           return
 *      //再找 当前树节点的左右子树
 *      left = i*2+1  (树的性质 :左子树节点等于 i*2+1)
 *      right = i*2+2
 *
 *          //判断节点 i的左子树是否越界
 *          if(left >= n):
 *              left = -1
 *          //判断节点 i的右子树是否越界
 *          if(right >= n):
 *              right = -1
 *
 *      //左右子树都越界(则该节点为 叶子节点无需操作)
 *      if(left ==-1 && right == -1 ):
 *          return ;
 *
 *      //如果 节点i 是集合 (节点i,节点i的左子树,节点i的右子树)中的最大值,无需操作(前提左右子树为非空)
 *      if(left!=-1 && right!=-1):
 *          if(Arr[i] >= Arr[left] && Arr[i] >= Arr[right]):
 *              return
 *      //否则 节点i 和集合 (节点i的左子树,节点i的右子树)中的 最大值交换
 *          esle:
 *              if(Arr[left]>Arr[right]):
 *                  max_index = left
 *              else:
 *                  max_index = right
 *              temp = Arr[i]
 *              Arr[i] = Arr[max_index]
 *              Arr[max_index] = temp
 *
 *
 *
 *      //存在这种情况 右子树是空树,左子树为非空 (右子树为非空,左子树为空树这种情况 由数组转换为堆根本就不存在!!!无需考虑)
 *      //如果在此情况下 左子树的值 大于 i节点的值 ,交换
 *      if((left != -1 && right == -1) && Arr[i]<Arr[left]):
 *          temp = Arr[i]
 *          Arr[i] = Arr[left]
 *          Arr[left] = temp
 *  }
 *
 */

初步建立大顶堆的动图

这个LeetCode有许多优秀的动图题解就不班门弄斧了。

堆排序步骤

1.初步建立大顶堆

2.将堆中最后一个节点(数组最后一个元素进行)和堆第一个元素进行交换
*3.缩小堆的范围进行建立大顶堆(比如: 最开始初步大顶堆的范围是 数组. 长度,交换后缩小为数组. 长度-1
4.直到堆为范围0时候,退出堆排序,得到排序好的

总结:看视频学习只是初步建立堆排序的印象,想要理解必须手写出排序过程再转化为伪代码,再验证才是真正掌握

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值