歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 用Java實現用序數法生成全排列

用Java實現用序數法生成全排列

日期:2017/3/1 10:40:36   编辑:Linux編程

用java實現用序數法生成全排列:

  1. import java.io.*;
  2. import java.util.ArrayList;
  3. class Arrangement{
  4. public static void main(String args[]){
  5. Arrangement arrangement = null;
  6. int num = 0;//要排序的個數
  7. boolean flag = true;//標志位,如果用戶輸入的待排序個數不合法,該值一直為true
  8. ArrayList<String> strs = new ArrayList<String>();
  9. while(flag){
  10. try{
  11. num = Integer.parseInt(readDataFromConsole("請輸入待排序的個數:"));
  12. flag = false;
  13. }catch(Exception e){
  14. System.out.println("請輸入整數.");
  15. }
  16. }
  17. for(int i = 1; i <= num; i ++){
  18. strs.add(readDataFromConsole("請輸入第" + i + "個字符: "));
  19. }
  20. arrangement = new Arrangement(strs.toArray(new String[]{}));
  21. System.out.println("排列後的數據為:");
  22. arrangement.sort();
  23. }
  24. private String[] str = null;
  25. public Arrangement(String[] s){
  26. this.str = s;
  27. }
  28. //從控制台讀入數據
  29. private static String readDataFromConsole(String prompt) {
  30. BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  31. String str = null;
  32. try {
  33. System.out.print(prompt);
  34. str = br.readLine();
  35. } catch (IOException e) {
  36. e.printStackTrace();
  37. }
  38. return str;
  39. }
  40. private void sort(){
  41. int num=str.length;
  42. int[] n1 = new int[num -1];
  43. int[] nss = new int[num];
  44. String[] s = new String[num];
  45. boolean flag = false;
  46. int x = 0;
  47. do{
  48. if(x == 0){//第一遍初始化
  49. for(int i = 0;i < num - 1;i ++){
  50. n1[i] = 0;
  51. }
  52. } else {//生成序數
  53. for(int i = 0;i < num - 1;i ++){
  54. if(n1[num - 2 - i] < i + 1){
  55. n1[num - 2 - i] ++;
  56. for(int j=num-1-i;j<num-1;j++){
  57. n1[j] = 0;
  58. }
  59. break;
  60. }
  61. }
  62. }
  63. for(int i = 0;i < num - 1;i++){
  64. if(n1[i] == (num - 1 - i)){
  65. flag = false;
  66. } else {
  67. flag = true;
  68. break;
  69. }
  70. }
  71. for(int i = 0;i < num;i++){//標記位賦初值
  72. nss[i] = 0;
  73. }
  74. for(int i = 0;i < num - 1;i++){//計算排列順序並為排列後的賦值
  75. int hh = 0, j = 0;//記錄前邊總共移動的位數
  76. do{
  77. if(nss[num - 1 - hh] == 1){
  78. hh++;
  79. continue;
  80. } else {
  81. if(j == n1[i]){
  82. break;//每個字母距最右端未填入的位置
  83. } else {
  84. hh++;
  85. j++;
  86. }
  87. }
  88. } while(true);
  89. hh = num - 1 - hh;
  90. s[hh] = str[num-1-i];
  91. nss[hh] = 1;
  92. }
  93. for(int i = 0; i < num;i++){//查找空缺位
  94. if(nss[i] == 0) {
  95. s[i] = str[0];
  96. break;
  97. }
  98. }
  99. System.out.print(++x + "\t");
  100. for(int i = 0;i < num - 1;i++){
  101. System.out.print(n1[i] + "");
  102. }
  103. System.out.print("\t");
  104. for(int i = 0;i < num;i++){
  105. System.out.print(s[i] + "");
  106. }
  107. System.out.println();
  108. }while(flag);
  109. }
  110. }
Copyright © Linux教程網 All Rights Reserved