用java实现换位法生成全排列

来源:互联网 发布:mysql查询笔试题及答案 编辑:程序博客网 时间:2024/06/05 16:48
import java.util.ArrayList;import java.io.*;//换位法生成全排列class ReplaceArrangement{//从控制台读入数据private static String readDataFromConsole(String prompt) {        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));        String str = null;        try {            System.out.print(prompt);            str = br.readLine();        } catch (IOException e) {            e.printStackTrace();        }        return str;    }public static void main(String args[]){class Node{int value = 0;// 元素值int dir = -1;// 0 : 左向箭头,1:有向箭头}System.out.println("------换位法求全排列---------");System.out.println("----第一个排列必须有序------");int n = 0;//元素个数boolean flag = true;//从控制台读入数据不合法的话,该值一直为truewhile(flag){try{n = Integer.parseInt(readDataFromConsole("请输入待排序元素个数: "));flag = false;}catch(Exception e){System.out.println("请输入整数.");}}flag = true;ArrayList<Node> nodes = new ArrayList<Node>(n);Node node = null;for(int i = 1;i <= n;i++){//排列初始化node =  new Node();while(flag){try{node.value = Integer.parseInt(readDataFromConsole("请输入第" + i + "个元素的值: "));flag = false;}catch(Exception e){System.out.println("请输入整数.");}}flag = true;node.dir = 0;nodes.add(node);node = null;}for(int i = 0;i < n;i++){System.out.print(nodes.get(i).value + "\t");}System.out.println();int count = 1;while(true){int j = 0; // 记录最大活动整数下标int Max = 0;for(int i = 0;i < n;i++){ // 找出最大活动整数if(0 == i && 0 == nodes.get(i).dir){Max = Max;}else if(n-1 == i && 1 == nodes.get(i).dir){ /// 此处应该是一次空操作,不可以轻易将Max 置为 0 ********Max = Max;}else if(0 == nodes.get(i).dir && i>0 && nodes.get(i).value>nodes.get(i - 1).value && nodes.get(i).value>Max){Max = nodes.get(i).value;j = i;}else if(1 == nodes.get(i).dir && i<n-1 && nodes.get(i).value>nodes.get(i + 1).value && nodes.get(i).value > Max){Max = nodes.get(i).value;j = i;}}//cout << endl;//cout << j << " " << Max << endl;if( 0 == Max ) // 没有活动整数 break;    if( 0 == nodes.get(j).dir)  // 交换最大整数与其相邻的数及方向{int temp,dirtemp;temp =nodes.get(j).value;dirtemp=nodes.get(j).dir;nodes.get(j).value=nodes.get(j - 1).value;nodes.get(j).dir=nodes.get(j - 1).dir;nodes.get(j - 1).value=temp;nodes.get(j - 1).dir=dirtemp;}    else if( 1 == nodes.get(j).dir){int temp,dirtemp;temp =nodes.get(j).value;dirtemp=nodes.get(j).dir;nodes.get(j).value=nodes.get(j + 1).value;nodes.get(j).dir=nodes.get(j + 1).dir;nodes.get(j + 1).value=temp;nodes.get(j + 1).dir=dirtemp;}for(int i=0;i<n;i++)//变换比最大活动整数大的数的方向{if(nodes.get(i).value>Max){if(0 == nodes.get(i).dir){nodes.get(i).dir=1;}else if(1 == nodes.get(i).dir){nodes.get(i).dir=0;}}}for(int i=0;i<n;i++){System.out.print(nodes.get(i).value + "\t");}count++;System.out.println();}System.out.println("排列总数为:" + count);}}

原创粉丝点击