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);
    }
  }
  . . .

Summary of Sorting

 
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)