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

用Java實現換位法生成全排列

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

用Java實現換位法生成全排列:

  1. import java.util.ArrayList;
  2. import java.io.*;
  3. //換位法生成全排列
  4. class ReplaceArrangement{
  5. //從控制台讀入數據
  6. private static String readDataFromConsole(String prompt) {
  7. BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  8. String str = null;
  9. try {
  10. System.out.print(prompt);
  11. str = br.readLine();
  12. } catch (IOException e) {
  13. e.printStackTrace();
  14. }
  15. return str;
  16. }
  17. public static void main(String args[]){
  18. class Node{
  19. int value = 0;// 元素值
  20. int dir = -1;// 0 : 左向箭頭,1:有向箭頭
  21. }
  22. System.out.println("------換位法求全排列---------");
  23. System.out.println("----第一個排列必須有序------");
  24. int n = 0;//元素個數
  25. boolean flag = true;//從控制台讀入數據不合法的話,該值一直為true
  26. while(flag){
  27. try{
  28. n = Integer.parseInt(readDataFromConsole("請輸入待排序元素個數: "));
  29. flag = false;
  30. }catch(Exception e){
  31. System.out.println("請輸入整數.");
  32. }
  33. }
  34. flag = true;
  35. ArrayList<Node> nodes = new ArrayList<Node>(n);
  36. Node node = null;
  37. for(int i = 1;i <= n;i++){//排列初始化
  38. node = new Node();
  39. while(flag){
  40. try{
  41. node.value = Integer.parseInt(readDataFromConsole("請輸入第" + i + "個元素的值: "));
  42. flag = false;
  43. }catch(Exception e){
  44. System.out.println("請輸入整數.");
  45. }
  46. }
  47. flag = true;
  48. node.dir = 0;
  49. nodes.add(node);
  50. node = null;
  51. }
  52. for(int i = 0;i < n;i++){
  53. System.out.print(nodes.get(i).value + "\t");
  54. }
  55. System.out.println();
  56. int count = 1;
  57. while(true){
  58. int j = 0; // 記錄最大活動整數下標
  59. int Max = 0;
  60. for(int i = 0;i < n;i++){ // 找出最大活動整數
  61. if(0 == i && 0 == nodes.get(i).dir){
  62. Max = Max;
  63. }else if(n-1 == i && 1 == nodes.get(i).dir){ /// 此處應該是一次空操作,不可以輕易將Max 置為 0 ********
  64. Max = Max;
  65. }else if(0 == nodes.get(i).dir && i>0 && nodes.get(i).value>nodes.get(i - 1).value && nodes.get(i).value>Max){
  66. Max = nodes.get(i).value;
  67. j = i;
  68. }else if(1 == nodes.get(i).dir && i<n-1 && nodes.get(i).value>nodes.get(i + 1).value && nodes.get(i).value > Max){
  69. Max = nodes.get(i).value;
  70. j = i;
  71. }
  72. }
  73. //cout << endl;
  74. //cout << j << " " << Max << endl;
  75. if( 0 == Max ) // 沒有活動整數
  76. break;
  77. if( 0 == nodes.get(j).dir) // 交換最大整數與其相鄰的數及方向
  78. {
  79. int temp,dirtemp;
  80. temp =nodes.get(j).value;
  81. dirtemp=nodes.get(j).dir;
  82. nodes.get(j).value=nodes.get(j - 1).value;
  83. nodes.get(j).dir=nodes.get(j - 1).dir;
  84. nodes.get(j - 1).value=temp;
  85. nodes.get(j - 1).dir=dirtemp;
  86. }
  87. else if( 1 == nodes.get(j).dir)
  88. {
  89. int temp,dirtemp;
  90. temp =nodes.get(j).value;
  91. dirtemp=nodes.get(j).dir;
  92. nodes.get(j).value=nodes.get(j + 1).value;
  93. nodes.get(j).dir=nodes.get(j + 1).dir;
  94. nodes.get(j + 1).value=temp;
  95. nodes.get(j + 1).dir=dirtemp;
  96. }
  97. for(int i=0;i<n;i++)//變換比最大活動整數大的數的方向
  98. {
  99. if(nodes.get(i).value>Max)
  100. {
  101. if(0 == nodes.get(i).dir){
  102. nodes.get(i).dir=1;
  103. }else if(1 == nodes.get(i).dir){
  104. nodes.get(i).dir=0;
  105. }
  106. }
  107. }
  108. for(int i=0;i<n;i++){
  109. System.out.print(nodes.get(i).value + "\t");
  110. }
  111. count++;
  112. System.out.println();
  113. }
  114. System.out.println("排列總數為:" + count);
  115. }
  116. }
Copyright © Linux教程網 All Rights Reserved