public T deleteMin() {
		int currentSize = heap.size() - 1;

		if (currentSize == 0) {
			return null;
		}

		// СԪ
		T x = heap.get(1);

		// һԪ
		T y = heap.remove(currentSize);

		// عӸʼΪyѰҺʵλ
		// ѵĵǰڵ
		int i = 1;
		// iĺ
		int ci = 2;
		currentSize = heap.size() - 1;

		try {
			Class<?> c = y.getClass();
			Method m = c.getMethod("compareTo", c);

			while (ci <= currentSize) {
				// ciӦiĽС
				if (ci < currentSize
						&& (Integer) m.invoke(heap.get(ci), heap.get(ci + 1)) > 0)
					ci++;
				// ܰyiλô
				if ((Integer) m.invoke(y, heap.get(ci)) <= 0)
					break;// 

				// ܣ
				heap.set(i, heap.get(ci));
				// һ
				i = ci;
				ci *= 2;

			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		if (currentSize >= i)
			heap.set(i, y);

		return x;

	}