code: private static <E extends Comparable<E>> void sort(E[] array, int start, int end, boolean descending) {
          if(start == end) {
              return ;
          }
          
          int middle = (start + end) >> 1;
          
          Merge.sort(array, start, middle, descending);
          Merge.sort(array, middle + 1, end, descending);
          
          if(descending) {
              Merge.mergeDescending(array, start, middle, end);                        
          }
          else {
              Merge.merge(array, start, middle, end);            
          }
      }
docs: Sort routine that recursively calls itself after splitting the original array
  in half. This routine is used for both ascending and descending sort since
  the work done is similar. The only difference is when calling the merge
  routine.
  
  @param <E> the type of elements in this array.
  
  @param array array that we want to sort
  @param start index of the starting point to sort
  @param end index of the end point to sort
  @param descending boolean value that determines if we want to do descending sort