import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.Vector;
/**
* @author <a href="http://mineraliccodesnippets.blogspot.com">MineralicCodeSnippets</a>
*/
public class Quick {
private static <T extends List<E>,E> void exchange(T data, int a, int b) {
E temp = data.get(a);
data.set(a, data.get(b));
data.set(b, temp);
}
private static <T extends List<E>, C extends Comparator<E>, E> int split(T data,C comparator, int left, int right)
{
int index = left;
for (int pointer = left; pointer < right; pointer++)
{
if (comparator.compare(data.get(pointer), data.get(right)) < 0 ) {
exchange(data, index, pointer);
index++;
}
}
exchange(data, index, right);
return index;
}
public static <T extends List<E>,E extends Comparable<E>> void sort(T data)
{
sort(data,false);
}
public static <T extends List<E>,E extends Comparable<E>> void sort(T data,boolean reverse)
{
Comparator<E> comparator;
if (reverse)
comparator = new Comparator<E>()
{
public int compare(E arg0, E arg1)
{
return -arg0.compareTo(arg1);
}
};
else
comparator = new Comparator<E>()
{
public int compare(E arg0, E arg1)
{
return arg0.compareTo(arg1);
}
};
sort(data,comparator,0,data.size()-1);
}
public static <T extends List<E>, C extends Comparator<E>,E> void sort(T data,C comparator)
{
sort(data,comparator,0,data.size()-1);
}
private static <T extends List<E>, C extends Comparator<E>,E> void sort(T data,C comparator, int left, int right)
{
if (right > left)
{
int splitIndicator = split(data, comparator, left, right);
sort(data, comparator, left, splitIndicator - 1);
sort(data, comparator, splitIndicator + 1, right);
}
}
public static void main(String[] args)
{
System.out.println("Test der Quick-Klasse\nSortierung eines String-Vektors");
Vector<String> v = new Vector<String>();
v.add("werner");
v.add("alf");
v.add("zorax");
v.add("Alf");
v.add("bert");
v.add("alf");
System.out.println("Vor der Sortierung:");
System.out.println(v);
Quick.sort(v);
System.out.println("Nach der Sortierung:");
System.out.println(v);
Quick.sort(v,true);
System.out.println("Nach der umgekehrten Sortierung:");
System.out.println(v);
System.out.println("\n\nSortierung einer Integer-Liste");
int[] a = new int[]{4,1,76,2,3,7,34,3,52,32,5};
LinkedList<Integer> l = new LinkedList<Integer>();
for (int i:a)
l.add(i);
System.out.println("Vor der Sortierung:");
System.out.println(l);
Quick.sort(l);
System.out.println("Nach der Sortierung:");
System.out.println(l);
Quick.sort(l,true);
System.out.println("Nach der umgekehrten Sortierung:");
System.out.println(l);
}
}
20061121
Generischer Quicksort
Abonnieren
Kommentare zum Post (Atom)

Keine Kommentare:
Kommentar veröffentlichen