用Java达成用序数法生成全排列
发布时间:2021-11-24 17:36:16 所属栏目:教程 来源:互联网
导读:用Java实现用序数法生成全排列: import java.io.*; import java.util.ArrayList; class Arrangement{ public static void main(String args[]){ Arrangement arrangement = null; int num = 0;//要排序的个数 boolean flag = true;//标志位,如果用户输入的
用Java实现用序数法生成全排列: 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); } } ![]() (编辑:PHP编程网 - 黄冈站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |