欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java实现可泛型的Heap 博客分类: Accumulation heap算法堆排序 

程序员文章站 2024-03-21 13:52:58
...

可泛型的Heap,方便使用。

Heap接口:

 

public interface Heap<T>
{
	/**
	 * return the top element of the heap
	 * 
	 * @return top element
	 */
	Object get();

	/**
	 * remove the top element of the heap and return it the heap must be fixed.
	 * 
	 * @return top element
	 */
	Object remove();

	/**
	 * reset the top element
	 * 
	 * @param obj
	 *            the new top element
	 */
	void set(T obj);

	/**
	 * add a element to the heap. if no comparator is set, the obj must be
	 * implments comparable interface
	 * 
	 * @param obj
	 *            the element to be added
	 */
	void add(T obj);

	/**
	 * if the heap is empty return true;
	 * 
	 * @return true if heap is empty,else false
	 */
	boolean isEmpty();

	/**
	 * clear the heap
	 */
	void clear();
}

 AbstractHeap类:

public class AbstractHeap<T> implements Heap<T>{

	private List<T> l = new ArrayList<T>(128);

	private Comparator<T> com;
	

	/*
     * 默认构造器
     * 接受泛型的数组
     */
	public AbstractHeap(T[] elements)
	{
		init(elements);
	}

	/*
     * 带Comparator的构造器
     * 如果com为null会抛出IllegalArgumentException
     */
	public AbstractHeap(Comparator<T> com, T[] elements)
	{
		if (com == null)
			throw new IllegalArgumentException("compartor can't be null");
		this.com = com;
		init(elements);
	}

	/*
     * 初始化Heap中的ArrayList
     */
	private void init(T[] elements)
	{
		l.add(null);
		for (int i = 0; i < elements.length; i++)
		{
			add(elements[i]);
		}
		System.out.println("Queue length is : " + l.size());
		System.out.println("Content is : " + l);
	}

	/*
     * 得到堆顶的元素
     */
	@Override
	public Object get()
	{
		return l.get(1);
	}

	/*
     * 移除堆顶端元素,并重新维护Heap
     */
	@Override
	public T remove()
	{
		T toReturn = l.get(1);
		T ret = l.get(l.size() - 1);
		l.set(1, ret);
		l.remove(l.size() - 1);
		
		fixDown(1);

		System.out.println("Queue length is : " + l.size());
		System.out.println("Content is : " + l);
		return toReturn;
	}
	/*
     * 检测Heap是否为空
     */
	@Override
	public boolean isEmpty()
	{
		return l.size() == 0;
	}

	/*
     * 情况Heap中所有元素
     */
	@Override
	public void clear()
	{
		l.clear();
	}

	/*
     * 将堆顶元素替换,并重新维护Heap
     */
	@Override
	public void set(T obj)
	{
		l.set(1, obj);
		fixDown(1);
	}

	/*
     * 向Heap中加入一个元素
     */
	@Override
	public void add(T obj)
	{
		l.add(obj);
		fixUP(l.size());
	}

	/*
     * 比较器
     */
	protected int compare(int i, int j) throws NoComparableException
	{
		if (com != null)
		{
			return com.compare(l.get(i), l.get(j));
		}
		else if (l.get(j) instanceof Comparable)
		{
			return ((Comparable) l.get(i)).compareTo(l.get(j));
		}
		else
		{
			throw new NoComparableException(
					"Not implements Comparable interface.");
		}
	}

	/*
     * 比较器
     */
	protected int compare(T i, T j) throws NoComparableException
	{
		if (com != null)
		{
			return com.compare(i, j);
		}
		else if (i instanceof Comparable)
		{
			return ((Comparable) i).compareTo(j);
		}
		else
		{
			throw new NoComparableException(
					"Not implements Comparable interface.");
		}
	}

	/*
     * 向上维护
     */
	private void fixUP(int start)
	{
		int k = start - 1;
		T s = l.get(k);
		try
		{
			while (k != 1 && compare(l.get(k >> 1), s) <= 0)
			{
				l.set(k, l.get(k >> 1));
				k >>= 1;

			}
		} catch (NoComparableException e)
		{
			e.printStackTrace();
		}
		l.set(k, s);
	}

	/*
     * 向下维护
     */
	private void fixDown(int k)
	{
		T ret = l.get(k);
		int j = k;
		int r = j * 2;
		int size = l.size() - 1;
		while (r <= size)
		{
			try
			{
				if (r < size && compare(l.get(r + 1), l.get(r)) > 0)
					r++;
				if (compare(l.get(r), ret) < 0)
					break;
			} catch (NoComparableException e)
			{
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			l.set(j, l.get(r));
			j = r;
			r *= 2;
		}
		l.set(j, ret);
	}
}

  最小推,MinHeap:

 

public class MinHeap<T> extends AbstractHeap<T>
{

	public MinHeap(T[] elements)
	{
		super(elements);
	}

	public MinHeap(Comparator<T> com, T[] elements)
	{
		super(com, elements);
	}

	/*
     * 注意两个参数比较的顺序
     */
	@Override
	protected int compare(int i, int j) throws NoComparableException
	{
		return super.compare(j, i);
	}

	@Override
	protected int compare(T i, T j) throws NoComparableException
	{
		return super.compare(j, i);
	}
}

 最大堆,MaxHeap:

 

public class MaxHeap<T> extends AbstractHeap<T>
{

	public MaxHeap(T[] elements)
	{
		super(elements);
	}

	public MaxHeap(Comparator<T> com, T[] elements)
	{
		super(com, elements);
	}

	/*
     * 注意两个参数比较的顺序
     */
	@Override
	protected int compare(int i, int j) throws NoComparableException
	{
		return super.compare(i, j);
	}

	@Override
	protected int compare(T i, T j) throws NoComparableException
	{
		return super.compare(i, j);
	}
}