数据结构-堆结构

本文详细介绍了堆结构的概念,包括大根堆和小根堆的定义,以及堆结构中的上移heapInsert和下沉heapify操作。通过代码展示了如何实现大根堆,并结合优先级队列,探讨了数组与堆中元素的关系。最后,总结了堆排序算法及其在实际开发中的应用。
摘要由CSDN通过智能技术生成

概念

  1. 堆结构就是用数组实现的完全二叉树结构
  2. 完全二叉树中如果每棵子树的最大值都在顶部就是大根堆
  3. 完全二叉树中如果每棵子树的最小值都在顶部就是小根堆
  4. 堆结构的上移heapInsert与下沉heapify操作
  5. 堆结构的增大和减少
  6. 优先级队列结构就是堆结构

完全二叉树

[外链图片转存失败,源站可能有防盗在这里插入!链机制,建描述]议将图片上https://传(imblog.csdig.cx/ba2a8fca3c6449caamneTM6ff494c87f8e9d.030)(https://img-我blog.csdnimg.cn/ba2a8fca3c6449caae6ff494c87f8e9d.png)]

数组中元素的位置与堆中的位置关系

  1. 第i个元素的左节点位置:2*i + 1
  2. 第i个元素的右节点位置:2*i + 2
  3. 第i个元素的父节点位置:(i-1)/ 2 向下取整

代码实现大根堆

/**
1.  新加进来的数,现在停在了index位置,依次往上移动,
2.  移动到0位置,或者不大于父节点,停!
*/
function heapInsert(arr, index) {
 while (arr[index] > arr[(index - 1) >> 2]) {
 // 交换数组中两个元素的位置
   swap(arr, index, (index - 1) >> 2);
   index = (index - 1) >> 2;
 }
}

/**
* 从index位置,往下看,不断的下沉
* 停:较大的孩子都不再比index位置的数大;已经没孩子了
* 如果当前节点小于孩子,节点和较大的孩子交换
* @param {*} arr 数组
* @param {*} i 位置
* @param {*} size 堆大小
*/
const heapify = (arr, i, size) => {
 let left = 2 * i + 1;
 while (left < size) {
   // 左节点存在,右节点可能存在或不存在,找到较大的节点位置
   let index = left + 1 < size && arr[left + 1] > arr[left] ? left + 1 : left;
   // 若较大节点的元素大于父节点元素
   let largest = arr[index] > arr[i] ? index : i;
   if (largest == i) break;
   swap(arr, largest, i);
   i = largest;
   left = 2 * i + 1;
 }
};

// 堆排序
function heapSort(arr) {
 // 建立大根堆  n*logn
 for (let i = 0; i < arr.length; i++) {
   heapInsert(arr, i);
 }
 // 第二种建立堆的方法 O(n)
 for (let i = arr.length - 1; i >= 0; i--) {
   heapify(arr, i, arr.length);
 }
 let heapSize = arr.length;
 swap(arr, 0, --heapSize);
 while (heapSize > 0) {
   heapify(arr, 0, heapSize); // O(logn)
   swap(arr, 0, --heapSize);
 }
}

function swap(arr, i, j) {
 let tem = arr[i];
 arr[i] = arr[j];
 arr[j] = tem;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值