Algorithm J
Algorithm J (Inverse in place). This algorithm has the same effect as Algo-
rithm I but uses a different method.
J1. [Negate all] Set X[k] <– -X[k], for 1 <= k <= n. Also set m <– n.
J2. [Initialize j] Set j <– m.
J3. [Find negative entry.] Set i <– X[j]. If i > 0, set j <– i and repeat this step.
J4. [Invert.] Set X[j] <– X[-i], X[-i] <– m.
J5. [Loop on m.] Decrease m by 1; if m > 0, go back to J2. Otherwise the
algorithm terminates. |
Data table
Java program
/**
* Created with IntelliJ IDEA.
* User: 1O1O
* Date: 12/18/13
* Time: 6:52 PM
* :)~
* Inverse in place-2:ALGORITHMS
*/
public class Main {
public static void main(String[] args) {
int[] X = new int[7];
int m;
int n=6;
int i;
int j;
X[1]=6;
X[2]=2;
X[3]=1;
X[4]=5;
X[5]=4;
X[6]=3;
/*Print the initial X[i] (1<=i<=n)*/
System.out.println("The initial X[i] (1<=i<=n) is:");
for(int k=1; k<=n; k++){
System.out.println("X["+k+"]="+X[k]);
}
System.out.println();
/*Print the initial permutation*/
System.out.println("The initial permutation is:");
System.out.print("| ");
for(int k=1; k<=n; k++){
System.out.print((char)(k+96));
System.out.print(' ');
}
System.out.print("|");
System.out.println();
System.out.print("| ");
for(int k=1; k<=n; k++){
System.out.print((char)(X[k]+96));
System.out.print(' ');
}
System.out.print("|");
System.out.println();
System.out.println();
m=n; /*J1*/
for(int k=1; k<=n; k++){
X[k] = -X[k];
}
/*Kernel of the Algorithm*/
do{
j = m; /*J2*/
do{ /*J3*/
i = X[j];
if(i > 0){
j = i;
}
}while (i > 0);
X[j] = X[-i]; /*J4*/
X[-i] = m;
m--; /*J5*/
}while (m > 0);
/*Print the final X[i] (1<=i<=n) after inversed*/
System.out.println("The final X[i] (1<=i<=n) after inversed is:");
for(int k=1; k<=n; k++){
System.out.println("X["+k+"]="+X[k]);
}
System.out.println();
/*Print the final permutation after inversed*/
System.out.println("The final permutation after inversed is:");
System.out.print("| ");
for(int k=1; k<=n; k++){
System.out.print((char)(k+96));
System.out.print(' ');
}
System.out.print("|");
System.out.println();
System.out.print("| ");
for(int k=1; k<=n; k++){
System.out.print((char)(X[k]+96));
System.out.print(' ');
}
System.out.print("|");
System.out.println();
}
}
Outputs
The initial X[i] (1<=i<=n) is:
X[1]=6
X[2]=2
X[3]=1
X[4]=5
X[5]=4
X[6]=3
The initial permutation is:
| a b c d e f |
| f b a e d c |
The final X[i] (1<=i<=n) after inversed is:
X[1]=3
X[2]=2
X[3]=6
X[4]=5
X[5]=4
X[6]=1
The final permutation after inversed is:
| a b c d e f |
| c b f e d a |
Reference
<< The Art of Computer Programming: Fundamental Algorithms >> VOLUME 1, DONALD E. KNUTH