您的位置:首页 > 编程语言 > Java开发

用java实现用序数法生成全排列

2011-12-24 15:42 169 查看
import java.io.*;
import java.util.ArrayList;

class Arrangement{

public static void main(String args[]){
Arrangement arrangement = null;
int num = 0;//要排序的个数
boolean flag = true;//标志位,如果用户输入的待排序个数不合法,该值一直为true
ArrayList<String> strs = new ArrayList<String>();
while(flag){
try{
num = Integer.parseInt(readDataFromConsole("请输入待排序的个数:"));
flag = false;
}catch(Exception e){
System.out.println("请输入整数.");
}
}
for(int i = 1; i <= num; i ++){
strs.add(readDataFromConsole("请输入第" + i + "个字符: "));
}
arrangement = new Arrangement(strs.toArray(new String[]{}));
System.out.println("排列后的数据为:");
arrangement.sort();
}

private String[] str = null;

public Arrangement(String[] s){
this.str = s;
}
//从控制台读入数据
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;
}

private void sort(){
int num=str.length;

int[] n1 = new int[num -1];
int[] nss = new int[num];
String[] s = new String[num];

boolean flag = false;
int x = 0;

do{
if(x == 0){//第一遍初始化
for(int i = 0;i < num - 1;i ++){
n1[i] = 0;
}
} else {//生成序数
for(int i = 0;i < num - 1;i ++){
if(n1[num - 2 - i] < i + 1){
n1[num - 2 - i] ++;
for(int j=num-1-i;j<num-1;j++){
n1[j] = 0;
}
break;
}
}
}
for(int i = 0;i < num - 1;i++){
if(n1[i] == (num - 1 - i)){
flag = false;
} else {
flag = true;
break;
}
}
for(int i = 0;i < num;i++){//标记位赋初值
nss[i] = 0;
}
for(int i = 0;i < num - 1;i++){//计算排列顺序并为排列后的赋值
int hh = 0, j = 0;//记录前边总共移动的位数
do{
if(nss[num - 1 - hh] == 1){
hh++;
continue;
} else {
if(j == n1[i]){
break;//每个字母距最右端未填入的位置
} else {
hh++;
j++;
}
}
} while(true);
hh = num - 1 - hh;
s[hh] = str[num-1-i];
nss[hh] = 1;
}
for(int i = 0; i < num;i++){//查找空缺位
if(nss[i] == 0) {
s[i] = str[0];
break;
}
}
System.out.print(++x + "\t");
for(int i = 0;i < num - 1;i++){
System.out.print(n1[i] + "");
}
System.out.print("\t");
for(int i = 0;i < num;i++){
System.out.print(s[i] + "");
}
System.out.println();
}while(flag);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: