`
dugu108
  • 浏览: 23313 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

堆Heap

 
阅读更多
public class Heap {
	public static void siftUp(int[] array, int i) {
		if (array == null || array.length <= 1 || i < 0 || i > array.length) {
			return;
		}
		while (true) {
			if (array[(i - 1) / 2] < array[i]) {
				swap(array, i, (i - 1) / 2);
			} else {
				break;
			}
			i = (i - 1) / 2;
		}
	}

	public static void siftDown(int[] array, int i) {
		if (array == null || array.length <= 1 || i < 0 || i > array.length) {
			return;
		}
		while (true) {
			int left = 2 * i + 1;
			int right = 2 * i + 2;
			if (right >= array.length) {
				if (left < array.length && array[i] < array[left]) {
					swap(array, i, left);
				}
				break;
			}
			int target = array[left] > array[right] ? left : right;
			if (array[target] > array[i]) {
				swap(array, i, target);
			}
			i = target;
		}
	}

	public static void siftDown(int[] array, int end, int i) {
		if (array == null || i < 0 || i > end) {
			return;
		}
		while (true) {
			int left = 2 * i + 1;
			int right = 2 * i + 2;
			if (right > end) {
				if (left < end && array[i] < array[left]) {
					swap(array, i, left);
				}
				break;
			}
			int target = array[left] > array[right] ? left : right;
			if (array[target] > array[i]) {
				swap(array, i, target);
			}
			i = target;
		}
	}

	/**
	 * put the element to insert to the last
	 * 
	 * @param array
	 * @param i
	 */
	public static void insert(int[] array) {
		siftUp(array, array.length - 1);
	}

	public static void delete(int[] array, int i) {
		if (array == null || array.length <= 1 || i < 0 || i > array.length) {
			return;
		}
		int tmp = array[i];
		array[i] = -1;
		if (i == array.length) {
			return;
		}
		swap(array, i, array.length - 1);
		if (array[i] > tmp)
			siftUp(array, i);
		else
			siftDown(array, i);
	}

	public static int deleteMax(int[] array) {
		int result = array[0];
		delete(array, 0);
		return result;
	}

	public static void makeHeap(int[] array) {
		if (array == null || array.length <= 1) {
			return;
		}

		for (int i = (array.length - 2) / 2; i >= 0; i--) {
			siftDown(array, i);
		}
	}

	public static void heapSort(int[] array) {
		if (array == null || array.length <= 1) {
			return;
		}
		makeHeap(array);
		for (int i = array.length - 1; i >= 0; i--) {
			swap(array, 0, i);
			siftDown(array, i - 1, 0);
		}
	}

	public static void swap(int[] array, int i, int j) {
		int tmp = array[i];
		array[i] = array[j];
		array[j] = tmp;
	}

	public static void main(String[] args) {
		int[] array = { 20, 17, 9, 10, 31, 4, 5, 3, 7, 5 };
		Heap.siftUp(array, 4);
		for (int i = 0; i < array.length; i++) {
			System.out.print(array[i] + " ");
		}
		System.out.println();

		int[] array2 = { 2, 17, 9, 10, 11, 4, 5, 3, 7, 5 };
		Heap.siftDown(array2, 0);
		for (int i = 0; i < array2.length; i++) {
			System.out.print(array2[i] + " ");
		}
		System.out.println();

		int[] array3 = { 20, 17, 9, 10, 11, 4, 5, 3, 7, 5, 30 };
		Heap.insert(array3);
		for (int i = 0; i < array3.length; i++) {
			System.out.print(array3[i] + " ");
		}
		System.out.println();

		int[] array4 = { 20, 17, 9, 10, 11, 4, 5, 3, 7, 5 };
		Heap.delete(array4, 5);
		for (int i = 0; i < array4.length; i++) {
			System.out.print(array4[i] + " ");
		}
		System.out.println();

		int[] array5 = { 5, 6, 3, 7, 8, 1, 10 };
		Heap.heapSort(array5);
		for (int i = 0; i < array5.length; i++) {
			System.out.print(array5[i] + " ");
		}
		System.out.println();
	}
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics