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.QuickSortable;
import util.jgp.interfaces.RandomAccessable;
import util.jgp.predicate.BinaryPredicate;

public class Sorter {
    
    public static void swap(QuickSortable v, int i, int j) {
	Object tmp = v.getElementAt(i);
	v.setElementAt(i, v.getElementAt(j));
	v.setElementAt(j, tmp);
    }
    
    public static void quickSort(QuickSortable v, BinaryPredicate lessThan, int first, int last) {
	if (first >= last)
	    return;
	
	int i = first;
	int j = last;
	Object mid = v.getElementAt(first);
	
	do 
	    {
		while (lessThan.execute(v.getElementAt(i), mid))
		    ++i;
		while (lessThan.execute(mid, v.getElementAt(j)))
		    --j;
		if (i <= j)
		    swap(v, i++, j--);
	    }
	while (i <= j);
	quickSort(v, lessThan, first, j);
	quickSort(v, lessThan, i, last);
    }
    
    public static void quickSort(QuickSortable v, BinaryPredicate lessThan) {
	quickSort(v, lessThan, 0, v.getSize() - 1);
    }
    
    public static void orderedInsertion(RandomAccessable v, BinaryPredicate lessThan, int first, int last, Object obj) {

	int i;

	for (i = first; i < last; ++i)
	    if (lessThan.execute(obj, v.getElementAt(i))) {
		
		int from = last - 1;
		int to   = last;
		while (to > i)
		    v.setElementAt(to--, v.getElementAt(from--));
		
		break;
	    }

	v.setElementAt(i, obj);
    }


    /*
       first              last 
       |                  |
      [....................]
                |
                i
                |
      [..........]  
       |        |
       first    last
      
     */

    public static void insertionSort(RandomAccessable v, BinaryPredicate lessThan, int first, int last) {
	for (int i = first; i <= last; ++i)
	    orderedInsertion(v, lessThan, first, i, v.getElementAt(i));
    }

    public static void insertionSort(RandomAccessable v, BinaryPredicate lessThan) {
	insertionSort(v, lessThan, 0, v.getSize() - 1);
    }
}