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