private static void paintInvariants(
     Graphics g,
     int size,
     SortingAlgorithm sortAlgorithm,
     int ulcx,
     int ulcy,
     int width,
     int height) {
   int nv = sortAlgorithm.getNumInvariants();
   for (int i = 0; i < nv; i++) {
     paintInvariant(g, sortAlgorithm.getInvariant(i), size, ulcx, ulcy, width, height);
   }
 }
  public static void paintSortState(
      Graphics g, SortingAlgorithm sortAlgorithm, int ulcx, int ulcy, int width, int height) {
    int s = sortAlgorithm.getSize();

    for (int i = 0; i < s; i++) {
      int item = sortAlgorithm.getItem(i);
      paintItem(g, i, item, s, Color.BLUE, ulcx, ulcy, width, height);
    }

    SortAction sa = sortAlgorithm.getNextAction();
    if (sa != null) {
      if (sa instanceof SwapAction) {
        SwapAction swap = (SwapAction) sa;
        paintItem(
            g,
            swap.getA(),
            sortAlgorithm.getItem(swap.getA()),
            s,
            Color.RED,
            ulcx,
            ulcy,
            width,
            height);
        paintItem(
            g,
            swap.getB(),
            sortAlgorithm.getItem(swap.getB()),
            s,
            Color.RED,
            ulcx,
            ulcy,
            width,
            height);
      } else if (sa instanceof CompareAction) {
        CompareAction comp = (CompareAction) sa;
        paintItem(
            g,
            comp.getA(),
            sortAlgorithm.getItem(comp.getA()),
            s,
            Color.GREEN,
            ulcx,
            ulcy,
            width,
            height);
        paintItem(
            g,
            comp.getB(),
            sortAlgorithm.getItem(comp.getB()),
            s,
            Color.GREEN,
            ulcx,
            ulcy,
            width,
            height);
      }
    }

    long numCompares = sortAlgorithm.getNumCompares();
    long numSwaps = sortAlgorithm.getNumSwaps();

    g.setColor(Color.BLACK);

    // g.drawString( "compares: " + numCompares, 50, 50 );
    g.drawString(
        "compares:" + numCompares, (int) (ulcx + width / 16.0), (int) (ulcy + height / 12.0));
    g.drawString("swaps: " + numSwaps, (int) (ulcx + width / 16.0), (int) (ulcy + height / 6.0));

    paintInvariants(g, s, sortAlgorithm, ulcx, ulcy, width, height);
  }