最大堆、最小堆---java实现

1、最小堆

/*
 * 最小堆:解决Top k的问题,例如 得到数组中第k大的数
 * 存储结构:实际上是一数组
 * 几个重要的操作:
 * 1、buildHeap将普通的数组转化为堆(所有父节点的值小于或者等于两个节点的值)
 * 2、heapify(int i):当元素i的左右子树都是小根堆时,通过heapify让i元素下降当适当的位置,以符合堆的性质
 */
public class MinHeap {
	private int[] data;//基本结构
	public MinHeap(int[] data) {
		this.data = data;
		buildHeap();//创建最小堆
	}
	private void buildHeap() {
		/*
		 * 完全二叉树只有数组小标小于或等于(data.length)/2 -1的元素有孩子节点
		 */
		for(int i = data.length / 2 -1;i>=0;i--) {
			//对有孩子节点的元素heapify
			heapify(i);
		}
	}
	private void heapify(int i) {
		//获取左右节点的数组下标:除数组第一个元素,其余元素将按照顺序2个分为1组,第一个节点的左右节点对应第一组元素,第二个节点的左右节点对应第二组元素。。。。
		//第i个节点的左右节点数组下标为 (i+1)*2-1 (i+1)*2
		int left = (i + 1) * 2 - 1;
		int right = (i + 1) * 2;
		int minIndex = i;//最小值的坐标
		//存在左结点,且左节点的值小于根节点的值
		if(left < data.length && data[left] < data[i])
			minIndex = left;
		//存在右节点,且右节点的子小于以上比较的较小值
		if(right < data.length && data[right] < data[minIndex])
			minIndex = right;
		//若该跟节点就是最小值,那么不用操作
		if(i == minIndex)
			return;
		//否则进行交换
		int temp = data[i];
		data[i] = data[minIndex];
		data[minIndex] = temp;
		//由于替换后的左右子树会被影响,所有要对受影响的子树在进行heapify
		heapify(minIndex);
	}
	
	//获取较小的元素
	public int getMin() {
		return data[0];
	}
	//插入元素
	public void insert(int val) {
		data[0] = val;
		heapify(0);
	}

}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值