/** * * @author gyb * 《算法導論(第二版)》--第六章 堆排序 * * maxHeapify(int[] a,i) * 將指定結點i的子樹成爲最大堆 * 書中僞代碼: * MAX-HEAPIFY(A, i) * l ← LEFT(i) * r ← RIGHT(i) * if l ≤ heap-size[A] and A[l] > A[i] * then largest ← l * else largest ← i * if r ≤ heap-size[A] and A[r] > A[largest] * then largest ← r * if largest ≠ i * then exchange A[i] ↔ A[largest] 10 * MAX-HEAPIFY(A, largest) * 時間複雜度 * 由於 :T (n) ≤ T(2n/3) + Θ(1) * 因此 :T (n) = O(lgn) * * buildMaxHeap(int[] a) * 自底向上地用MAX-HEAPIFY將一個數組A[1..n](此處n=length[A])變成一個最大堆 * 書中僞代碼: * BUILD-MAX-HEAP(A) * heap-size[A] ← length[A] * for i ← length[A]/a downto 1 (此處length[A]/2作向下取整,符號沒打出來...) * do MAX-HEAPIFY(A, i) * 時間複雜度 * 由於 :O(n)次調用O(lgn) * 因此 :T(n) = O(nlgn) * 可是更加緊確值爲: O(n) * 具體緣由看書。 * */ public class HeapTest { // private static int[] a = new int[] { 16,4,10,14,7,9,3,2,8,1 }; // private static int[] a = new int[] { 4,1,3,2,16,9,10,14,8,7 }; private static int[] a = new int[] { 5,3,17,10,84,19,6,22,9}; private static int heapSize = a.length; public static void maxHeapify(int[] a, int i){ int l = i*2; int r = l+1; int largest; if(l <= heapSize && a[l-1] > a[i-1]){ largest = l; }else{ largest = i; } if(r <= heapSize && a[r-1] > a[largest-1]){ largest = r; } if(i != largest){ int temp = a[i-1]; a[i-1] = a[largest-1]; a[largest-1] = temp; maxHeapify(a,largest); } } public static void buildMaxHeap(int[] a){ for(int i = a.length / 2; i > 0; i--) maxHeapify(a, i); } public static void output(){ StringBuffer sb = new StringBuffer(); for (int i : a) { sb.append(i); sb.append(" "); } System.out.println(sb.toString()); } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub maxHeapify(a,4); // buildMaxHeap(a); output(); } }