Collections Data Structure Java

/**
 * created Dec 12, 2007
 * 
 * @by Marc Woerlein (woerlein@informatik.uni-erlangen.de)
 *
 * Copyright 2007 Marc Woerlein
 * 
 * This file is part of parsemis.
 *
 * Licence: 
 *  LGPL: http://www.gnu.org/licenses/lgpl.html
 *   EPL: http://www.eclipse.org/org/documents/epl-v10.php
 *   See the LICENSE file in the project's top-level directory for details.
 */
//package de.parsemis.utils;
/**
 * generate ordered permutations of an integer array
 * 
 * @author Marc Woerlein (woerlein@informatik.uni-erlangen.de)
 */
public class Permutations {  /**
   * Sorts parts of the given array with the quicksort algorithm using the
   * given comparator.
   * 
   * @param field
   *            the field to be sorted
   * @param left
   *            the left start index in the field (inclusive)
   * @param right
   *            the right end index in the field (inclusive)
   * @param comp
   *            a comparator
   */
  public static void quickSort(final int[] field, final int left,
      final int right, final IntComparator comp) {
    if (right - left == 2) {
      if (comp.compare(field[left], field[left + 1]) > 0) {
        swap(field, left, left + 1);
      }
      if (comp.compare(field[left + 1], field[right]) > 0) {
        swap(field, right, left + 1);
      }
      if (comp.compare(field[left], field[left + 1]) > 0) {
        swap(field, left, left + 1);
      }
    } else if (right - left == 1) {
      if (comp.compare(field[left], field[right]) > 0) {
        swap(field, left, right);
      }
    } else {
      int l = left, r = right;
      int pivot = (right - left) / 2 + left;
      while (l < r) {
        while ((pivot < r)
            && (comp.compare(field[pivot], field[r]) <= 0)) {
          r--;
        }
        if (pivot < r) {
          swap(field, pivot, r);
          pivot = r;
        }
        while ((l < pivot)
            && (comp.compare(field[l], field[pivot]) <= 0)) {
          l++;
        }
        if (l < pivot) {
          swap(field, pivot, l);
          pivot = l;
        }
      }
      if (l - 1 - left > 0) {
        quickSort(field, left, l - 1, comp);
      }
      if (right - (r + 1) > 0) {
        quickSort(field, r + 1, right, comp);
      }
    }
  }
  /**
   * Sorts the given int[] -field with quicksort using the
   * given comparator.
   * 
   * @param field
   *            the field to be sorted
   * @param comp
   *            a comparator
   * @return the sorted field (the same as field)
   */
  public static int[] quickSort(final int[] field, final IntComparator comp) {
    quickSort(field, 0, field.length - 1, comp);
    return field;
  }
  /**
   * swaps the values of the array at position i and j
   * 
   * @param array
   * @param i
   * @param j
   */
  public static void swap(final int array[], final int i, final int j) {
    final int temp = array[i];
    array[i] = array[j];
    array[j] = temp;
  }
}
interface IntComparator {
  int compare(int a, int b);
}