/**
  * mergesort
  *
  * @param a - the array that will be sorted
  * @param begin - first index to be sorted
  * @param end - index behind the last element
  */
 void mergesort(E[] a, int begin, int end) {
   // step
   if (end - begin < 2) return;
   else {
     int middle = begin + ((end - begin) / 2);
     mergesort(a, begin, middle);
     mergesort(a, middle, end);
     merge(a, begin, middle, end);
   }
 }