#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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
技术学习总结
学习技术一定要制定一个明确的学习路线,这样才能高效的学习,不必要做无效功,既浪费时间又得不到什么效率,大家不妨按照我这份路线来学习。
最后面试分享
大家不妨直接在牛客和力扣上多刷题,同时,我也拿了一些面试题跟大家分享,也是从一些大佬那里获得的,大家不妨多刷刷题,为金九银十冲一波!
VmH-1711865632938)]
[外链图片转存中…(img-S1MrobDj-1711865632938)]
最后面试分享
大家不妨直接在牛客和力扣上多刷题,同时,我也拿了一些面试题跟大家分享,也是从一些大佬那里获得的,大家不妨多刷刷题,为金九银十冲一波!
[外链图片转存中…(img-egHo3wgi-1711865632939)]
[外链图片转存中…(img-DdAzJNKz-1711865632939)]