20061121

Generischer Quicksort

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);
 }
}

Keine Kommentare: