class QuickSort
{
   static int partition(int[] f, int a, int b)
   {
      int i = a;
      int j = b-1;

      do
      {
         //naechstes Paar zum Tauschen suchen
         while((f[i] <= f[b]) && (i < b)){i++;}
         while((f[j] >= f[b]) && (j > a)){j--;}
         
         //ggfs. Tauschen
         if(i < j)
         {
            int h = f[i];
            f[i]  = f[j];
            f[j]  = h;
         }
      }while(i < j);

      //ggfs. Pivotelement an die richtige Stelle
      //tauschen
      if(f[i] > f[b])
      {
         int h = f[i];
         f[i]  = f[b];
         f[b]  = h;
      }

      //Position des Pivotelements zurueckgeben
      return i;
   }

   static void performQuickSort(int[] f, int l, int r)
   {
      //Test ob zu sortierender Abschnitt des
      //Arrays mindestens zwei Elemente enthaelt
      if(l < r)
      {
         //bzgl. des Pivotelements aufteilen
         int pivpos = partition(f,l,r);
         
         //rekursiv die Teile sortieren
         performQuickSort(f,l,pivpos-1);
         performQuickSort(f,pivpos+1,r);
      }
   }

   static void printArray(int[] a)
   {
      for(int i = 0; i < a.length; i++)
      {
         System.out.print(a[i] + " ");
      }
      System.out.print("\n");
   }

   public static void main(String[] args)
   {
      int[] folge = {13,4,15,3,16,12,2,1,51,26,11};
      
      printArray(folge);

      performQuickSort(folge,0,folge.length-1);

      printArray(folge);
   }
}
