易网时代-编程资源站
Welcome
微信登录
首页
/
操作系统
/
Linux
/
用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 +
" "
);
}
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 +
" "
);
}
count++;
System.out.println();
}
System.out.println(
"排列总数为:"
+ count);
}
}
版权所有©石家庄振强科技有限公司2024
冀ICP备08103738号-5
网站地图