package test;
/**
* 左孩子 2n+1 右孩子 2n+2 最后非叶子节点 (size-2)/2
*
*/
public class HeapSort {
int arr[];
int size;
private HeapSort() {
size = 10;
arr = ArrCreater.create(size);
}
/**
* 将下标为index的元素下沉到找不到比他小的子节点为止
* @param index
*/
private void down(int index) {
int left = 2 * index + 1;
int right = 2 * index + 2;
int temp = arr[index], child, childindex;
// System.out.println("download:" + index + " -> " + temp);
if (left < size) {
if (right < size) {
if (arr[left] < arr[right]) {
childindex = left;
} else {
childindex = right;
}
} else {
childindex = left;
}
child = arr[childindex];
if (child < temp) {
arr[index] = child;
arr[childindex] = temp;
// ArrCreater.printArr(arr);
down(childindex);
}
}
}
/**
* 删除最小元素(根节点)
* @return
*/
public int pop() {
if (size > 0) {
int root = arr[0];
arr[0] = arr[size - 1];
size--;
build();
return root;
} else {
return -1;
}
}
/**
* 构建二叉堆
* 从最后的非叶子节点开始进行下沉 值到根节点为最小
*/
public void build() {
int lastindex = (size - 2) / 2;
for (int i = lastindex; i >= 0; i--) {
down(i);
}
}
/**
* 堆排序
* @param args
*/
public static void main(String args[]) {
HeapSort hs = new HeapSort();
ArrCreater.printArr(hs.arr);
hs.build();
ArrCreater.printArr(hs.arr);
while (hs.size > 0) {
System.out.println(hs.pop());
}
}
}