用Java实现换位法生成全排列
用Java实现换位法生成全排列
用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);
- }
- }
评论暂时关闭