public MinHeap<T> init(List<T> heap) {

		this.heap = heap;
		this.heap.add(0, null);

		int currentSize = heap.size() - 1;

		// һС
		for (int i = currentSize / 2; i >= 1; i--) {
			T y = heap.get(i);// ĸ

			// Ѱҷyλ
			int ci = i * 2;// ciĸڵyĿλ
			try {
				while (ci <= currentSize) {
					Class<?> c = y.getClass();
					Method m = c.getMethod("compareTo", c);
					// ciӦǽСͬڵ
					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(ci / 2, heap.get(ci));
					// һ
					ci *= 2;

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

			heap.set(ci / 2, y);
		}

		return this;
	}