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

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;//从控制台读入数据不合法的话,该值一直为true
		while(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);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值