abstract class Algrithm<T> {
private T[] pri = null;
public abstract boolean cmp(T x, T y);
public void sorted(T [] arr){
sorted(arr,0,arr.length);
}
public void sorted(T [] arr,int start,int end){
pri = arr.clone();
qsorted(arr,start,end);
}
public void sorted(List<T> arr){
sorted(arr,0,arr.size());
}
public void sorted(List<T> arr,int start,int end){
pri = (T[]) arr.toArray();
qsorted(arr,start,end);
}
private void qsorted(T [] arr,int start,int end){
if(start>=end-1)return ;
int e = (end-start)/2+start;
//System.out.println(start+","+e+","+end);
qsorted(arr,start,e);
qsorted(arr,e,end);
int tail=0;
for(int i=start,j=e;i<e||j<end;){
if(i<e&&j<end){
if(cmp(arr[i],arr[j])){
pri[tail++]=arr[i++];
}else pri[tail++]=arr[j++];
}else if(i<e){
pri[tail++]=arr[i++];
}else pri[tail++]=arr[j++];
}
for(int i=start,j=0;i<end;i++){
arr[i]=pri[j++];
}
}
private void qsorted(List<T> arr,int start,int end){
if(start==end-1)return ;
int e = (end-start)/2+start;
qsorted(arr,start,e);
qsorted(arr,e,end);
int tail=0;
for(int i=start,j=e;i<e||j<end;){
if(i<e&&j<end){
if(cmp(arr.get(i),arr.get(j))){
pri[tail++]=arr.get(i++);
}else pri[tail++]=arr.get(j++);
}else if(i<e){
pri[tail++]=arr.get(i++);
}else pri[tail++]=arr.get(j++);
}
for(int i=0;i<end-start;i++){
arr.set(i+start,pri[i]);
}
}
}