java 实现最大堆及堆排序

 * 从0开始的最大堆
 * 通过插入排序的思想进行了优化
 * 实现了增删改查

/**
 * 从0开始的最大堆
 * 通过插入排序的思想进行了优化
 * 实现了增删改查
 * @author 叶叶叶
 *
 * @param <E>
 */
public class MaxHeap<E extends Comparable<E>>{

	private Array<E> data;//data自带了size
	
	public MaxHeap() {
		data = new Array<>();
	}
	
    public MaxHeap(int capacity){
        data = new Array<>(capacity);
    }
    
    public int size() {//当前元素的个数
    	return data.getSize();
    }
	
    public boolean isEmpty() {//该最大堆,是否为空
    	return size()==0;
    }
    
    public int parent(int index) {//找到父元素的索引,即下标
    	if(index == 0)
    		throw new IllegalArgumentException("index-0 doesn't have parent.");   		
    	return (index-1)/2;
    }
    
    public int leftChild(int index) {//找左孩子的索引
    	return 2*index + 1;
    }
    
    public int rightChild(int index) {//找右孩子的索引
    	return 2*index + 2;
    }
    
    public void add(E e) {//增加一个元素在最后,然后不停的与父亲比较,再让父亲与父亲的父亲比较
    	data.addLast(e);
    	siftUp(size()-1);//传入下标
    }
    
    public void remove() {
    	
    }
    
	private void siftUp(int index) {
		E temp = data.get(index);
		while(index>0 && temp.compareTo(data.get(parent(index))) > 0) {
				data.set(index, data.get(parent(index)));
			index = parent(index);
		}
		data.set(index, temp);
	}

    // 看堆中的最大元素
    public E findMax(){
        if(data.getSize() == 0)
            throw new IllegalArgumentException("Can not findMax when heap is empty.");
        return data.get(0);
    }
    
    // 取出堆中最大元素
    public E extractMax() {
    	E ans = findMax();
    	data.set(0, data.get(size()-1));
    	data.removeLast();
    	siftDown(0);
		return ans;
    	
    }
    
    public E replace(E e) {    // 取出堆中的最大元素,并且替换成元素e
    	E ans = findMax();
    	data.set(0, e);
    	siftDown(0);
    	return ans;
    }
	
	private void siftDown(int index) {
		E temp = data.get(index);
		while(leftChild(index)<size()) {//右孩子空或者左孩子大的情况下,索引指向左孩子
			if(rightChild(index)>=size() || data.get(leftChild(index)).compareTo(data.get(rightChild(index)))>0) {
				if(temp.compareTo(data.get(leftChild(index))) > 0)
					break;
				index = leftChild(index);
			}
			else {
				if(temp.compareTo(data.get(rightChild(index))) > 0)
					break;
				index = rightChild(index);
			}
			data.set(parent(index), data.get(index));
		}
		data.set(index, temp);
	}

	boolean isMaxHeap() {
		return isMaxHeap(0, null);
	}
	public boolean isMaxHeap(int index,E e) {
		if(index >= size())
			return true;
	
		return (e==null?true:(data.get(index).compareTo(e)<0)) && isMaxHeap(leftChild(index),data.get(index)) && isMaxHeap(rightChild(index),data.get(index));
	}
	@Override
	public String toString() {
		StringBuilder res = new StringBuilder();
        res.append(String.format("MaxHeap: size = %d , capacity = %d, isMaxHeap:"+isMaxHeap()+"\n", size(), data.getCapacity()));
        res.append('[');
        for(int i = 0 ; i < size() ; i ++){
            res.append(data.get(i));
            if(i != size() - 1)
                res.append(", ");
        }
        res.append(']');
        return res.toString();
	}

	public static void main(String[] args) {
		MaxHeap<Integer> heap = new MaxHeap<>();
		for(int i=0;i<15;i++) {
			heap.add(new Integer((int) (100*Math.random())));
			System.out.println(heap);
		}
		for(int i=0;i<5;i++) {
			heap.extractMax();
			System.out.println(heap);
		}
	}

}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值