public class HeapSort
{
static void adjust_heap(int[] heap, int root, int len)
{
boolean done; /* 是否可结束的变量 */
int j;
int temp;
j = 2 * root; /* 子结点指针 */
temp = heap[root]; /* 堆的根值 */
done = false; /* 建立变量 */
while (j <= len && !done) { /* 主循环 */
if (j < len) /* 找最大的子结点 */ {
if (heap[j] < heap[j + 1]) {
j++; /* 下一结点 */
}
}
if (temp >= heap[j]) /* 比较树根值 */ {
done = true; /* 结束 */
}
else {
heap[j / 2] = heap[j]; /* 父结点是目前结点 */
j = 2 * j; /* 其子结点 */
}
}
heap[j / 2] = temp; /* 父结点为根值 */
}
static void heap(int[] heap, int len)
{
int i, j, temp;
for (i = (len / 2); i >= 1; i--) /*将二叉树转成堆*/ {
adjust_heap(heap, i, len);
}
System.out.print("/n堆中数据: "); /* 换行 */
for (j = 1; j < 10; j++) /*输出堆的内容 */ {
System.out.print(heap[j]);
}
System.out.print("/n"); /* 换行 */
for (i = len - 1; i >= 1; i--) { /* 堆排序主循环 */
temp = heap[i + 1]; /* 交换最后元素 */
heap[i + 1] = heap[1];
heap[1] = temp;
adjust_heap(heap, 1, i); /* 重建堆 */
System.out.print("/n处理内容: ");
for (j = 1; j < 10; j++) /* 输出处理内容 */ {
System.out.print(heap[j]);
}
}
}
public static void main(String[] args)
{
/* 二叉树结点数据 */
int data[] = new int[] {
0, 5, 6, 4, 8, 2, 3, 7, 1, 9};
int i;
System.out.print("二叉树的内容: ");
for (i = 1; i < 10; i++) /* 输出二叉树内容 */ {
System.out.print(data[i]);
}
heap(data, 9); /* 堆排序法 */
System.out.print("/n/n输出排序结果: ");
for (i = 1; i < 10; i++) /* 输出最后内容 */ {
System.out.print(data[i]);
}
System.out.print("/n");
}
}