最小堆和最大堆的建立以及基本操作,java多线程面试题目

建立最小堆


#include<bits/stdc++.h>

using namespace std;

// 根据 已有的数组 进行调整(向下调整)如果 孩子比关键值小 就交换;

void downadjust(int heap[],int adjust,int last){//adjust时待调整的下标 last是数组最后的下标

int i = adjust;

int j = 2 * i;//为i的左孩子

while ( j <= last)

{

if( j + 1 <=last && heap[j+1] < heap[j]){//比较 关键值的左右孩子 谁更小

j++;

}

if( heap[i] > heap[j]){//如果待调整的点比其孩子值(已将其左右孩子的最小值进行比较)大 那么就交换

swap(heap[i],heap[j]);

i = j; //完成交换 将其孩子的下标赋值给 待调整值得下标

j = 2 * i;//因为 现在 待调整点得下标更新了 所以 其孩子得下标也得更新 (方便继续向下调整)

}

else{

break;//如果待调整的值 已经比其孩子的值小那就不需要调整;

}

}

}

//创建堆的函数

void creatheap(int heap[],int n){

int i;

for(i = n / 2; i >= 1; i–){//完全二叉树当中其[1,n/2]为非叶子结点的下标 在已经有的完全二叉树当中(进行调整,那么调整的效果 从非叶子结点开始较好)

downadjust(heap,i,n);

}

}

//删除堆顶元素

int deletetop(int heap[],int last){

int temp = heap[1];

heap[1] = heap[last];//将最后一个元素赋值给堆顶元素 然后再进行向下调整

heap[last] = temp;

last–;

downadjust(heap,1,last);//从 堆顶开始 向下调整

return temp;

}

//(向上调整 与其双亲比较大小 如果 比双亲小 那就交换)插入元素要用的函数

void upadjust(int heap[],int last){//向上调整 (将要插入的元素放到数组的最后面,然后与其双亲进行比较)

int i = last;

int j = i / 2;//表示其双亲

while( j >= 1){//只要父母不是堆顶就调整

if(heap[i] < heap[j]){

swap(heap[i], heap[j]);

i = j; //将其父母的下标赋值给待调整的下标

j = i/2;//更新 其父母的下标

}

else{

break;//说明插入的已经比其父母的值小 那就不用调整。

}

}

}

//插入函数

void insert(int heap[],int last,int x){

heap[++last] = x; //++last先开辟空间比如 last=8 ;++last = 9; last++ = 8;

upadjust(heap,last);

}

//堆排序 (这样输出的顺序 是降序)

void sortheap(int heap[],int last){

for(int i = last; i >= 1; i–){

swap(heap[1],heap[i]);

downadjust(heap,1,i-1);//每次将最小的放到最后面 然后调整 前面(i-1)个元素

}

}

int main(){

int heap[6] ={0,2,1,3,4,5}; //数组的第一个值为0 我们是从 i = 1;开始的, 如果 没有 0 那么2对应的下标就为0

creatheap(heap,5);

// cout << "依次删除堆顶元素 那么出来的顺序是升序 " << endl;

// for(int i = 5; i >= 1; i–){

// int number = deletetop(heap,i);

// cout<< number <<’ ';

// }

cout<<endl;

cout<<“插入元素7 并逆序输出”<<endl;

insert(heap,5,7);

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

技术学习总结

学习技术一定要制定一个明确的学习路线,这样才能高效的学习,不必要做无效功,既浪费时间又得不到什么效率,大家不妨按照我这份路线来学习。

最后面试分享

大家不妨直接在牛客和力扣上多刷题,同时,我也拿了一些面试题跟大家分享,也是从一些大佬那里获得的,大家不妨多刷刷题,为金九银十冲一波!

VmH-1711865632938)]

[外链图片转存中…(img-S1MrobDj-1711865632938)]

最后面试分享

大家不妨直接在牛客和力扣上多刷题,同时,我也拿了一些面试题跟大家分享,也是从一些大佬那里获得的,大家不妨多刷刷题,为金九银十冲一波!

[外链图片转存中…(img-egHo3wgi-1711865632939)]

[外链图片转存中…(img-DdAzJNKz-1711865632939)]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值