Algorithm: Inverse in place-2

来源:互联网 发布:网络播放器怎么安装 编辑:程序博客网 时间:2024/05/29 16:51

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]=6X[2]=2X[3]=1X[4]=5X[5]=4X[6]=3The 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]=3X[2]=2X[3]=6X[4]=5X[5]=4X[6]=1The 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

0 0
原创粉丝点击