加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 教程 > 正文

用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编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读