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);
}
}
用java实现换位法生成全排列
最新推荐文章于 2023-04-12 23:16:11 发布