public class MaxHeap {
private int data[];
private int size;
public MaxHeap(int data[]) {
this.data = data;
size = data.length;
System.out.printf("orig order: %s\n", Arrays.toString(data));
System.out.printf("total len: %d\n", size);
for (int i=size/2; i>=0; i--) {
heapify(i);
}
}
public void sort() {
for (int i=data.length-1; i>=0; i--) {
int nextMax = removeNext();
data[i] = nextMax;
}
}
public int removeNext() throws NoSuchElementException {
int Max = data[0];
if (size == 0) {
throw new NoSuchElementException();
}
data[0] = data[--size];
heapify(0);
System.out.printf("heap len: %d, removed item %d\n", size, Max);
return Max;
}
private int leftChild(int i) { return 2*i+1; }
private int rightChild(int i) { return 2*i+2; }
private void heapify(int i) {
int l=leftChild(i);
int r=rightChild(i);
int largestElementIdx = -1;
if (l <= size-1 && data[i] < data[l]) {
largestElementIdx = l;
} else {
largestElementIdx = i;
}
if (r <= size-1 && data[largestElementIdx] < data[r]) {
largestElementIdx = r;
}
if (largestElementIdx != i) {
int temp = data[i];
data[i] = data[largestElementIdx];
data[largestElementIdx] = temp;
heapify(largestElementIdx);
}
}
public static void main(String[] args) {
int A[] = new int[]{ 4, 1, 3, 2, 16, 9, 10, 14, 8, 7, 232, 435, 3565};
MaxHeap sorter= new MaxHeap(A);
sorter.sort();
System.out.println(Arrays.toString(A));
}
}
No comments:
Post a Comment