package sort; import java.util.ArrayList; import com.hygenics.comparator.CompareObjects; /** * Generic general purpose QuickSort. Sorts any list. O(nlogn) or O(n^2) but * can run smaller data better than heap or merge sorts. * * @author asevans * * @param <E> */ public class QuickSort<E>{ private ArrayList<E> tosortlist; private CompareObjects<E> comparator=new CompareObjects<E>(); public QuickSort(){ } public ArrayList<E> getTosortlist() { return tosortlist; } public void setTosortlist(ArrayList<E> tosortlist){ //sort list this.tosortlist = tosortlist; } /** * Exchange two positions */ private void exchange(int newhigh, int newlow){ //TODO exchange positions in our list E temp=tosortlist.get(newhigh); tosortlist.set(newhigh, tosortlist.get(newlow)); tosortlist.set(newlow, temp); temp=null; } /** * Perform the quicksort * @param high * @param low */ private void run(int high, int low){ //TODO run the quicksort int newhigh=high; int newlow=low; int pivot=(int)Math.ceil((low + high)/2); while(newlow <= newhigh){ //get the splits while(newhigh > 0 & comparator.compare(tosortlist.get(newhigh),tosortlist.get(pivot))==1){ newhigh--; } while(newlow < (tosortlist.size()-1) & comparator.compare(tosortlist.get(newlow),tosortlist.get(pivot))==-1) { newlow++; } if(newlow<=newhigh){ exchange(newhigh,newlow); newlow++; newhigh--; } //recursively get new list if (low < newhigh){ run(newhigh,low); } if (newlow < high){ run(high,newlow); } } } /** * Run the quicksort */ private ArrayList<E> run(){ run((tosortlist.size()-1),0); //return our new sorted list return tosortlist; } /** * Perform the sort * @return */ public ArrayList<E> sort(){ if(tosortlist==null){ try{ throw new NullPointerException("No List to QuckSort!"); }catch(NullPointerException e) { e.printStackTrace(); } } else if(tosortlist.size()<2) { return tosortlist; } return run(); } }