演算法導論第六章(堆排序)
阿新 • • 發佈:2019-02-04
維護堆的性質(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); } } }