Monday, May 12, 2014

Beauty of Heap Sort

import java.util.*;

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