Java实现堆及其功能

adjustDown(p,this.usedSize);

}

}

//每棵树的调整方案是从上往下的

public void adjustDown(int parents,int len){

int child=2*parents+1;

while (child<len){

//判断左右孩子谁大,并且要有右孩子

if(child+1<len&&this.elem[child+1]>this.elem[child]){

child++;

}

if(this.elem[child]>this.elem[parents]){

int tmp=this.elem[child];

this.elem[child]=this.elem[parents];

this.elem[parents]=tmp;

parents=child; //判断下面的树也要调整为大堆,

child=2*parents+1;

}else {

break;//结束循环

}

}

}

二、入堆(入队列)

============================================================================

先尾插法方式放入数组,将元素放到最后一个位置,向上调整,不需要比较左右孩子大小,只比较和父亲结点大小即可,

public void adjustUp(int child){

int parents=(child-1)/2;

while(child>0){

if(this.elem[child]>this.elem[parents]){

//交换

int tmp=this.elem[child];

this.elem[child]=this.elem[parents];

this.elem[parents]=tmp;

child=parents;

parents=(child-1)/2;

}else {

break;

}

}

}

三、出堆(出队列)

============================================================================

返回优先级最高的对象,即头节点,将头结点和最后一个元素交换,剪掉最后一个元素,调用调整方法重新键堆

代码如下(示例):

public void pop(){

/* if(isEmpty()){

return;

}*/

int tmp=this.elem[0];

this.elem[0]=this.elem[this.usedSize-1];

this.elem[this.usedSize-1]=tmp;

this.usedSize–;

adjustDown(0,this.usedSize);

}

四、优先级队列

==========================================================================

PriorityQueuepriorityQueue=new PriorityQueue<>();//优先级队列 默认是小堆

//改为大堆

PriorityQueuepriorityQueue1=new PriorityQueue<>(new Comparator() {//改为大堆

@Override

public int compare(Integer o1, Integer o2) {

return o2-o1;

}

});

五、TopK问题

===========================================================================

即找出数组中前K个最值问题,时间复杂度为nlogK,

如果找的是前K个最大值,

1.建立大小为K的小堆

2.遍历数组将K个元素放入堆中

3.从K+1位置开始和堆顶元素进行比较

4.如果比堆顶元素大的话,就出小的元素,之后大的入堆

5.最终输出小堆就前K个最大元素

找最小值就是建大堆。

public static void TopK(int[]array,int k){

PriorityQueue minHeap=new PriorityQueue<>(k);

for (int i=0;i<array.length;i++){

if(k>0){

minHeap.offer(array[i]);

k–;

}else {

Integer val=minHeap.peek();

if(array[i]>val){//如果K+1位置的值大于堆顶的元素 就出

minHeap.poll();

minHeap.offer(array[i]);

}

}

}

System.out.println(minHeap);

}

六、堆排序

========================================================================

从小到大排序,建立一个大堆 每次将堆顶元素和最后位置元素调换,end位置减1,将所有位置都调整完成后,就是有序的。

//堆排序 从小到大排序 应该是建大堆(能知道最上面是最大的)

public static void heapSort(int []array){

createHeap(array);

int end=array.length-1;

// while(){//循环 建立大堆 每次都是头最大 交换 尾巴节点

while (end>0){

int tmp=array[0];

array[0]=array[end];

array[end]=tmp;

adjust(array,0,end);

end–;

}

最后

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

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

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

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

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

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值