- 构建一个大顶堆。
- 依次获取大顶堆的第一个元素,即当前未排序子序列中最大元素。
- 注意:沿关键字较大的孩子节点向下筛选,防止调换后破坏较大孩子 节点的结构(较大孩子节点大于自身左右子节点)
package SortTest;
import java.util.Scanner;
public class HeapSort {
/**
* 堆排序
* @param args
*/
static void HeapSort(int[] a) {
int i;
for (i = a.length / 2; i > 0; i--) {
HeapAdjust(a, i, a.length);
}
for (i = a.length-1; i > 0; i--) {
swap(a, 0, i);
HeapAdjust(a, 0, i - 1);
}
}
private static void swap(int[] a, int i, int i2) {
int temp = a[i];
a[i] = a[i2];
a[i2] = temp;
}
private static void HeapAdjust(int[] a, int i, int length) {
int temp, j;
temp = a[i];
for (j = 2 * i; j < length; j *= 2) {
if (j < length && a[j] < a[j + 1])
++j;
if (temp >= a[j])
break;
a[i] = a[j];
i = j;
}
a[i] = temp;
}
public static void main(String[] args) {
Scanner sca = new Scanner(System.in);
int count = sca.nextInt();
int[] a = new int[count];
for (int i = 0; i < count; i++) {
a[i] = sca.nextInt();
}
HeapSort(a);
for (int j = 0; j < a.length; j++) {
System.out.print(a[j] + " ");
}
}
}