private static int partition(double[] data, int first, int last) {
 
    double pivot = data[first];
    int tooBigIndex = first + 1;
    int tooSmallIndex = last;
 
    while (tooBigIndex <= tooSmallIndex) {
      while (tooBigIndex <= last && data[tooBigIndex] <= pivot) {
        tooBigIndex++; }
      while (data[tooSmallIndex] > pivot) {
        tooSmallIndex--;}
      if (tooBigIndex < tooSmallIndex) {
        double temp = data[tooBigIndex];
        data[tooBigIndex] = data[tooSmallIndex];
        data[tooSmallIndex] = temp;
      }
    }
    data[first] = data[tooSmallIndex];
    data[tooSmallIndex] = pivot;
   return tooSmallIndex;
  }