1. 程式人生 > >演算法導論第六章(堆排序)

演算法導論第六章(堆排序)

維護堆的性質(MAX-HEAPIFY):

每一步從A[i],A[LEFT(i)],A[RIGHT(i)]中選出最大的。如果A[i]是最大的,程式結束。如果不是,則A[i]和最大的那一個交換。以原來最大的節點為根的字數又可能違反最大堆的性質,因此,對該子樹遞迴呼叫MAX-HEAPIFY。

package chapter6_sort;

public class HeapSort {
	public static void main(String[] args) {
		int[] arr = new int[6];
		for (int i = 1; i < 6; i++) {
			arr[i] = (int) (Math.random() * 100);
		}

		int heapSize = arr.length - 1;// 5

		buildMaxHeap(arr, heapSize);

		for (int i = heapSize; i > 1; i--) {
			int temp = arr[1];
			arr[1] = arr[i];
			arr[i] = temp;

			heapSize = heapSize - 1;

			maxHeapify(arr, 1, heapSize);
		}

		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}

	}

	private static void maxHeapify(int[] arr, int i, int heapSize) {
		int l = i * 2;
		int r = i * 2 + 1;
		int largest;
		if (arr[l] > arr[i] && l <= heapSize) {
			largest = l;
		} else {
			largest = i;
		}
		if (arr[r] > arr[largest] && r <= heapSize) {
			largest = r;
		}
		if (largest != i) {
			int t = arr[i];
			arr[i] = arr[largest];
			arr[largest] = t;
			if (largest < (int) Math.floor(heapSize / 2) + 1) {

				maxHeapify(arr, largest, heapSize);
			}
		}

	}

	private static void buildMaxHeap(int[] arr, int heapSize) {
		for (int i = (int) Math.floor(heapSize / 2); i > 0; i--) {
			maxHeapify(arr, i, heapSize);
		}

	}
}