Comp202: Principles of Object-Oriented Programming II
Fall 2006 -- Lecture #37: Heaps and Heap Sort   


Heap Sort


How is split() sped up?



What is a Heap?



Implementing a Heap?



Heap Sort Basics



Heap Sort: split()

public int split(int[] A, int lo, int hi) {
    // Swap A[hi] and A[lo].
    int temp = A[hi];
    A[hi] = A[lo];
    A[lo] = temp;

    // Restore the heap property by ``sifting down''
    //  the element at A[lo].
    Heapifier.Singleton.siftDown(A, lo, lo, hi - 1);

    return hi;
}


Example of siftDown()



siftDown(): The Implementation

public void siftDown(int[] A, int lo, int cur, int hi) {
    int dat = A[cur];             // hold on to data.
    int child = 2 * cur + 1 - lo; // index of left child of A[cur].
    boolean done = hi < child;

    while (!done) {

        if (child < hi && A[child + 1] < A[child]) {
            child++;
        } // child is the index of the smaller of the two children.

        if (A[child] < dat) {
            A[cur] = A[child];
            cur = child;
            child = 2 * cur + 1 - lo;
            done = hi < child;
        }                     // A[cur] is less than its children.
        else {                // A[cur] <= A[child].
            done = true;        // heap condition is satisfied.
        }                     // A[cur] is less than its children.
    }                       // location found for temp.
    A[cur] = dat;
}


Initializing the Heap: HeapSorter()

public class HeapSorter extends ASorter {
    public HeapSorter(int[] A, int lo, int hi)  {
        for (int cur = (hi - lo + 1) / 2; cur >= lo; cur--) {
            Heapifier.Singleton.siftDown(A, lo, cur, hi);
        }
    }
  // etc. . .
}

Sample Code


Summary of Sorting (see also SortSummary.pdf)

 
Best-case Cost Worst-case Cost
Selection O(n2) O(n2)
Insertion O(n) O(n2)
Heap O(n log n) O(n log n)
Merge O(n log n) O(n log n)
Quick O(n log n) O(n2)

 


Last Revised Thursday, 03-Jun-2010 09:52:26 CDT

©2006 Stephen Wong and Dung Nguyen