//----------------------------------------------------------------------------------------
  void quicksort(vector<int> & x, int l, int u)
  {
    if(l >= u)
      return;

    RandomNumberGenerator rng;
    
    int random = rng.getRandomNumberInRange(l, u);
    swap(x[l], x[random]);

    int t = x[l];
    int i = l;
    int j = u + 1;

    while(true)
    {
      do
      {
	++i;
      }while(i <= u && x[i] <= t);
    
      do
      {
	--j;
      }while(x[j] > t);
      
      if(i > j)
	break;
    

      swap(x[i], x[j]);
    }
    
    //Get back randomly picked pivot in its place
    swap(x[l], x[j]);

    quicksort(x, l, j - 1);
    quicksort(x, j + 1, u);  
  }