import java.util.Arrays; public class HeapSort { public static void main(String[] args) { int[] a = { 2, 5, 9, 6, 1, 4, 8, 7, 12, 50 }; sort(a); System.out.println(Arrays.toString(a)); } public static void sort(int[] a) { int len = a.length; for (int i = 0; i < len - 1; i++) { // 建堆 buildHeap(a, len - 1 - i); // 交换堆顶元素和最后一个元素 swap(a, 0, len - 1 - i); } } private static void swap(int[] a, int i, int j) { // TODO Auto-generated method stub int tmp = a[i]; a[i] = a[j]; a[j] = tmp; } public static void buildHeap(int[] a, int lastIndex) { // 从最后一个节点的父节点开始 for (int i = (lastIndex - 1) / 2; i >= 0; i--) { // 当前节点存在子节点 while (i * 2 + 1 <= lastIndex) { // 左节点下标值 int l = i * 2 + 1; // 右结点下标值 int r = i * 2 + 2; // 默认左节点为最大值 int biggerIndex = l; // 存在右结点 if (l < lastIndex) { // 右结点的值比左节点大 if (a[r] > a[l]) { biggerIndex = r; } } // 当前节点的值比孩子节点的最小值小,交换 if (a[i] < a[biggerIndex]) { swap(a, i, biggerIndex); // 把最大值下标赋给当前节点,进入下一次while循环判断 i = biggerIndex; } else { break; } } } } }