jmud-0.11/
jmud-0.11/bin/
jmud-0.11/doc/
jmud-0.11/rec/
jmud-0.11/rec/mun/
jmud-0.11/rec/mun/grecia/
jmud-0.11/rec/mun/gunnar/
jmud-0.11/rec/qua/
jmud-0.11/src/bool/
jmud-0.11/src/clone/
jmud-0.11/src/integer/
jmud-0.11/src/misc/
jmud-0.11/src/string/
jmud-0.11/src/util/bit/
jmud-0.11/src/util/color/
jmud-0.11/src/util/file/
jmud-0.11/src/util/jgp/adaptor/
jmud-0.11/src/util/jgp/algorithm/
jmud-0.11/src/util/jgp/container/
jmud-0.11/src/util/jgp/functor/
jmud-0.11/src/util/jgp/interfaces/
jmud-0.11/src/util/jgp/predicate/
jmud-0.11/src/util/log/
jmud-0.11/src/util/state/
jmud-0.11/trash/
package util.jgp.algorithm;

import util.jgp.interfaces.RandomAccessable;
import util.jgp.predicate.BinaryPredicate;

public class QuickSorter {

    static final int THRESHOLD = 50;

    private RandomAccessable vec      = null;
    private BinaryPredicate  lessThan = null;
    private InsertionSorter  sorter   = null;

    public QuickSorter(RandomAccessable v, BinaryPredicate less) {
	vec      = v;
	lessThan = less;
	sorter   = new InsertionSorter(v, less);
    }

    public void sort(int first, int last) {

	if (Math.abs(last - first) < THRESHOLD) {
	    sorter.sort(first, last);
	    return;
	}

	int i = first;
	int j = last;
	Object mid = vec.getElementAt(first);

	do 
	    {
		while (lessThan.execute(vec.getElementAt(i), mid))
		    ++i;
		while (lessThan.execute(mid, vec.getElementAt(j)))
		    --j;
		if (i <= j) {
		    Object tmp = vec.getElementAt(i);
		    vec.setElementAt(i, vec.getElementAt(j));
		    vec.setElementAt(j, tmp);
		    ++i;
		    --j;
		}
	    }
	while (i <= j);
	if (first < j)
	    sort(first, j);
	if (i < last) 
	    sort(i, last);

    }

    public void sort() {
	int last = vec.getSize() - 1;
	if (0 < last)
	    sort(0, last);
    }
}