/**
  * method realises the recursive algorithm with half division
  *
  * @param left left boundary of array
  * @param right right boundary of array
  */
 private void doSortRecursiveHalfDivision(int left, int right) {
   int middle = tempArray[(left + right) / 2];
   int i = left;
   int j = right;
   while (i <= j) {
     while (tempArray[i] < middle) {
       i++;
     }
     while (tempArray[j] > middle) {
       j--;
     }
     if (i <= j) {
       int temp = tempArray[i];
       tempArray[i] = tempArray[j];
       tempArray[j] = temp;
       i++;
       j--;
     }
   }
   if (left < j) {
     doSortRecursiveHalfDivision(left, j);
   }
   if (i < right) {
     doSortRecursiveHalfDivision(i, right);
   }
 }
 /**
  * method initialises auxiliary array
  *
  * @param array gets an array for sorting
  */
 private void sortRecursiveHalfDivision(int[] array) {
   this.tempArray = array;
   int left = 0;
   int right = array.length - 1;
   doSortRecursiveHalfDivision(left, right);
 }