算法导论第六章(堆排序)

来源:互联网 发布:商业化软件验收 编辑:程序博客网 时间:2024/06/02 04:34

维护堆的性质(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;// 5buildMaxHeap(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);}}}


原创粉丝点击