数据结构 之 堆

优先队列

普通队列:先进先出,后进后出

优先队列:出队顺序和入队顺序无关,只与优先级有关;可以方便地动态选择优先级最高的任务执行

优先队列的实现:
(1)普通数组:入队O(1),出队O(n)
(2)顺序数组:入队O(n),出队O(1)
(3)堆:入队O(logn),出队O(logn)

堆是一棵完全二叉树。最大堆中,节点的值总是不大于其父节点的值。

使用数组存储堆:
在这里插入图片描述
Shift Up 操作:新加入堆的元素,与其父节点进行比较,若新元素大,则与父节点交换位置,使堆满足最大堆的基本要求
在这里插入图片描述

Shift Down 操作:弹出堆中最大的元素(堆顶元素)后,将数组尾部元素填补到堆顶,而后将该元素和两个子节点元素较大的那个进行比较,若该元素小,则与子节点交换位置,直至该元素大于两个子节点或已进入堆的最后一层
在这里插入图片描述
Heapify 操作:对于前n/2个元素(即非叶子节点的元素)进行 Shift Down 操作,使之成为最大堆
在这里插入图片描述
比较:将n个元素逐个插入到空堆当中,算法复杂度为O(nlogn);使用Heapify操作,算法复杂度为O(n)

堆排序

算法描述:每次从堆中弹出队首,即为最大的元素,与队尾进行交换操作;则蓝色有序部分长度加1,重复操作
在这里插入图片描述
堆结构:
在这里插入图片描述
代码实现

template<typename T>
void heapSort(T arr[], int n){

    for( int i = (n-1)/2 ; i >= 0 ; i -- )
        __shiftDown(arr, n, i);

    for( int i = n-1; i > 0 ; i-- ){
        swap( arr[0] , arr[i] );
        __shiftDown(arr, i, 0);
    }
}
最大索引堆

数据结构:使用index保存数据存放的位置,而数据存放在data当中;构建堆的过程中,修改的是index的内容;rev用于反向查找,表示索引在堆中的位置

最大索引堆可以很方便地修改,查找复杂类型的数据
在这里插入图片描述
在这里插入图片描述
关系如下:
在这里插入图片描述

最大最小队列

二项堆

斐波那契堆

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值