After codingbat, my programming challenge is to solve 100 problems from UVA online judge.
This is more than doable! after finishing this milestone, i will solve another 100, another 100.... Up to infinity!

I follow the tip to master all major algorithms. I have problems with mergesort - i needed to understand it. So in this version i include lots of print statements to see how arrays are filled.



public class mergesort{
 static void merge(int a[], int start, int pivot, int finish){
   System.out.println("\n\n*********************") ;
  int tmp[] = new int[finish - start +1] ;
  System.out.println("temp array created! len " + tmp.length) ;
  for(int i = 0 ; i < tmp.length;i++) tmp[i] = 0 ;
  int I = start ;
  int J = pivot +1 ;
  int K = 0 ;
  while((I <= pivot)&& ( J <= finish) ){
    System.out.println("comparing elements: " + a[I] +" and "+ a[J]) ;
    if(a[I] < a[J]){
      System.out.println(a[I] + " inserted") ;
      tmp[K] = a[I] ; K++ ; I++ ;
      printarray(tmp, tmp.length) ;
    }
    else{
      System.out.println(a[J] + " inserted") ;
      tmp[K] = a[J] ; K++ ; J++ ;
      printarray(tmp, tmp.length) ;
    }
  }
 
  if(I <= pivot){
   System.out.println("still some left before middle") ;
    while(I <= pivot){
      printarray(tmp,tmp.length) ;
      tmp[K++] = a[I++] ;
    }
  }
  if( J<= finish){
   System.out.println("still some left before end") ;
    while(J<= finish){
     
      printarray(tmp,tmp.length) ;
      tmp[K++] = a[J++] ;
    }
  }
  for(K = start ; K <= finish ; K++) a[K] = tmp[K-start] ;
  return ;  
}
static void mergesort(int a[], int start, int finish, String parent){
   
    System.out.println("\n mergesort called, parent " + parent) ;
  if(start < finish){
   
    int pivot = (start + finish)/2 ;
    System.out.println("\n\n\n\nsplitting into 2 arrays :" + start + " to " + pivot + ", " + (pivot+1) + " to " + finish ) ;
   
    mergesort(a,start, pivot, "first") ;
    mergesort(a, pivot+1, finish, "second") ;
    merge(a, start, pivot, finish) ;
  }

}

public  static void printarray(int a[], int len){
  for(int i = 0 ; i < len; i++) System.out.print("* " + a[i]) ;
  System.out.println() ;
}
public static void main(String args[]){
  int test[] = {4,5,6,7,11,12,10,20,30,40,1,2,3} ;
 
  int len =  test.length ;
  System.out.println("len : " + len) ;  
   printarray(test,len) ;
  mergesort(test,0, len-1, "") ;
 
   printarray(test,len) ;
   }
}