package highOrder;

public abstract class Sorter {
  private int[] numbers;

  public Sorter(int[] values) {
    this.numbers = values;
  }

  public void sort() {
    /*
     * Uncomment this part to fix the bug:
     * if (numbers.length > 0) { quicksort(0, numbers.length - 1); }
     */
    quicksort(0, numbers.length - 1);
  }

  private void quicksort(int low, int high) {
    int i = low, j = high;
    int pivot = numbers[(low + high) / 2];
    while (i <= j) {
      // while (numbers[i] < pivot) {
      while (lt(numbers[i], pivot)) {
        i++;
      }
      // while (numbers[j] > pivot) {
      while (gt(numbers[j], pivot)) {
        j--;
      }
      if (i <= j) {
        exchange(i, j);
        i++;
        j--;
      }
    }
    if (low < j)
      quicksort(low, j);
    if (i < high)
      quicksort(i, high);
  }

  private void exchange(int i, int j) {
    int temp = numbers[i];
    numbers[i] = numbers[j];
    numbers[j] = temp;
  }

  abstract boolean lt(int i, int j);

  abstract boolean gt(int i, int j);
}
