`
public class Heap {
private List<Integer> heap;
private int size;
public static void main(String[] args) {
Random rand = new Random(47);
List<Integer> list = new ArrayList<>();
for (int i=0; i<10; i++) {
list.add(rand.nextInt(100));
}
for (int i=0; i<list.size(); i++) {
System.out.print(list.get(i) + " ");
}
System.out.println();
Heap_last heap = new Heap(list);
heap.trav();
heap.heapSort();
heap.trav();
}
public Heap(List list) { //构造既建堆
if (list == null)
throw new IllegalArgumentException("list is null");
heap = list;
size = list.size();
for (int i=size/2; i>=0; i--)
precolateDown(i);
}
public void heapSort() { //堆排序
size = size - 1; //size先充当数组的哨兵
while (size > 0) {
swap(0, size--); //最大元素交换到最末尾
precolateDown(0); //对首元素进行下滤
}
size = heap.size(); //还原size
}
private void precolateDown(int i) { //下滤算法
int left = (i << 1) + 1;
int right = (i+1) << 1;
int largest = i;
while (true) {
if (left < size && get(i) < get(left)) {
largest = left;
}
if (right < size && get(largest) < get(right)) {
largest = right;
}
if (largest != i) {
swap(i, largest);
i = largest;
} else {
break;
}
left = (i << 1) + 1;
right = (i+1) << 1;
}
}
private Integer get(int index) {
return heap.get(index);
}
public void set(int index, Integer element) {
heap.set(index, element);
}
public void swap(int index1, int index2) {
Integer temp = get(index1);
heap.set(index1, get(index2));
heap.set(index2, temp);
}
public void trav() {
for (int i=0; i<heap.size(); i++)
System.out.print(heap.get(i) + " ");
System.out.println();
}
} `