@@ -0,0 +1,1954 @@
+package de.sebhn.algorithm.excersise4;%0D%0A%0D%0A/**%0D%0A * %0D%0A * @author Phi Long Tran %3C191624%3E%0D%0A * @author Dimitri Kapcikov %3C191510%3E%0D%0A * @author Manuel Wessner %3C191711%3E%0D%0A */%0D%0Apublic class Perm extends Thread %7B%0D%0A  private int%5B%5D a; // a Arbeitsarray%0D%0A  private int max; // maximaler Index%0D%0A  private boolean mayread = false; // Kontrolle%0D%0A%0D%0A  Perm(int n) %7B // Konstruktor%0D%0A    a = new int%5Bn%5D; // Indices: 0 .. n-1%0D%0A    max = n - 1; // Maximaler Index%0D%0A    for (int i = 0; i %3C= max;) %7B%0D%0A      a%5Bi%5D = i++; // a fuellen%0D%0A    %7D%0D%0A    this.start(); // run-Methode beginnt zu laufen%0D%0A  %7D%0D%0A%0D%0A  public void run() %7B// die Arbeits-Methode%0D%0A    perm(1); // a%5B0%5D bleibt fest; permutiere ab 1%0D%0A    a = null; // Anzeige, dass fertig%0D%0A    put(); // ausliefern%0D%0A  %7D%0D%0A%0D%0A  private void perm(int i) %7B // permutiere ab Index i%0D%0A    if (i %3E= max) %7B%0D%0A      put(); // eine Permutation fertig%0D%0A    %7D else %7B%0D%0A      for (int j = i; j %3C= max; j++) %7B // jedes nach Vorne%0D%0A        swap(i, j); // vertauschen%0D%0A        perm(i + 1); // und Rekursion%0D%0A      %7D%0D%0A      int h = a%5Bi%5D; // restauriere Array%0D%0A      System.arraycopy(a, i + 1, a, i, max - i); // shift links%0D%0A      a%5Bmax%5D = h;%0D%0A    %7D%0D%0A  %7D%0D%0A%0D%0A  private void swap(int i, int j) %7B // tausche a%5Bi%5D %3C-%3E a%5Bj%5D%0D%0A    if (i != j) %7B%0D%0A      int h = a%5Bi%5D;%0D%0A      a%5Bi%5D = a%5Bj%5D;%0D%0A      a%5Bj%5D = h;%0D%0A    %7D%0D%0A  %7D%0D%0A%0D%0A  synchronized int%5B%5D getNext() %7B // liefert naechste Permutation%0D%0A    mayread = false; // a darf geaendert werden%0D%0A    notify(); // wecke anderen Thread%0D%0A    try %7B%0D%0A      while (!mayread) %7B%0D%0A        wait(); // non busy waiting%0D%0A      %7D%0D%0A    %7D catch (InterruptedException e) %7B%0D%0A    %7D%0D%0A    return a; // liefere Permutationsarray%0D%0A  %7D%0D%0A%0D%0A  private synchronized void put() %7B // uebergebe array%0D%0A    mayread = true; // a wird gelesen%0D%0A    notify(); // wecke anderen Thread%0D%0A    try %7B%0D%0A      if (a != null) %7B%0D%0A        while (mayread) %7B%0D%0A          wait(); // non busy waiting%0D%0A        %7D%0D%0A      %7D%0D%0A    %7D catch (InterruptedException e) %7B%0D%0A    %7D%0D%0A  %7D%0D%0A%7D%0D%0A

add perm