Algorithm: Inverse in place-2

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值