ojSort<T extends Comparable> function utilities

void ojSort<T extends Comparable>(
  1. List<T> a
)

Heapsort somewhat optimized for small sets, like a hand of cards.

Implementation

void ojSort<T extends Comparable>(List<T> a) {
  switch (a.length) {
    case 5:
      if (a[0].compareTo(a[1]) < 0) {
        T temp = a[0];
        a[0] = a[1];
        a[1] = temp;
      }
      if (a[3].compareTo(a[4]) < 0) {
        T temp = a[3];
        a[3] = a[4];
        a[4] = temp;
      }
      if (a[2].compareTo(a[4]) < 0) {
        T temp = a[2];
        a[2] = a[4];
        a[4] = temp;
      }
      if (a[2].compareTo(a[3]) < 0) {
        T temp = a[2];
        a[2] = a[3];
        a[3] = temp;
      }
      if (a[0].compareTo(a[3]) < 0) {
        T temp = a[0];
        a[0] = a[3];
        a[3] = temp;
      }
      if (a[0].compareTo(a[2]) < 0) {
        T temp = a[0];
        a[0] = a[2];
        a[2] = temp;
      }
      if (a[1].compareTo(a[4]) < 0) {
        T temp = a[1];
        a[1] = a[4];
        a[4] = temp;
      }
      if (a[1].compareTo(a[3]) < 0) {
        T temp = a[1];
        a[1] = a[3];
        a[3] = temp;
      }
      if (a[1].compareTo(a[2]) < 0) {
        T temp = a[1];
        a[1] = a[2];
        a[2] = temp;
      }
      break;
    case 4:
      if (a[0].compareTo(a[1]) < 0) {
        T temp = a[0];
        a[0] = a[1];
        a[1] = temp;
      }
      if (a[2].compareTo(a[3]) < 0) {
        T temp = a[2];
        a[2] = a[3];
        a[3] = temp;
      }
      if (a[0].compareTo(a[2]) < 0) {
        T temp = a[0];
        a[0] = a[2];
        a[2] = temp;
      }
      if (a[1].compareTo(a[3]) < 0) {
        T temp = a[1];
        a[1] = a[3];
        a[3] = temp;
      }
      if (a[1].compareTo(a[2]) < 0) {
        T temp = a[1];
        a[1] = a[2];
        a[2] = temp;
      }
      break;
    case 3:
      if (a[1].compareTo(a[2]) < 0) {
        T temp = a[1];
        a[1] = a[2];
        a[2] = temp;
      }
      if (a[0].compareTo(a[2]) < 0) {
        T temp = a[0];
        a[0] = a[2];
        a[2] = temp;
      }
      if (a[0].compareTo(a[1]) < 0) {
        T temp = a[0];
        a[0] = a[1];
        a[1] = temp;
      }
      break;
    case 2:
      if (a[0].compareTo(a[1]) < 0) {
        T temp = a[0];
        a[0] = a[1];
        a[1] = temp;
      }
      break;
    case 1:
    case 0:
      break;
    default:
      for (int i = a.length ~/ 2; i >= 0; i -= 1) {
        _heapify(a, a.length, i);
      }
      for (int i = a.length - 1; i >= 1; i -= 1) {
        T temp = a[0];
        a[0] = a[i];
        a[i] = temp;
        _heapify(a, i, 0);
      }
      break;
  }
}