全排列算法——JohnsonTrotter之粗略实现(1)

来源:互联网 发布:iphone故障检测软件 编辑:程序博客网 时间:2024/06/15 06:38

今天看到了JohnsonTrotter算法,通过穷举来计算给定数据的全排列。

因为一点逻辑错误调了很久,所以在程序设计师设计模式方面还没有考虑很周到,以后会慢慢改进的。

实现代码如下:

package algorithm;import java.util.ArrayList;public class JohnsonTrotter {public boolean isMoveExist(ArrayList<Vector> A){boolean isExist = false;for(int i = 0;i < A.size();i++){if(i+A.get(i).direction>=0&&i+A.get(i).direction<A.size()&&A.get(i).value>A.get(i+A.get(i).direction).value){isExist = true;A.get(i).isMove = true;}else{A.get(i).isMove = false;}}return isExist;}public int toSearchMax(ArrayList<Vector> A){int maxIndex = Integer.MIN_VALUE;int max = -1;for(int i =0;i<A.size();i++){if(A.get(i).isMove){if(A.get(i).value>maxIndex){maxIndex =A.get(i).value;max = i;}}}//当前最大可移动元素的下标....return max;}//将最大可移动的元素进行移动并作相应的操作...public void swap(ArrayList<Vector> A,int max){int temp1;int temp2;int newInstance = A.get(max).direction+max;for(int i = 0;i < A.size();i++){if(A.get(i).value>A.get(max).value){A.get(i).direction = 0 - A.get(i).direction;}}temp1 = A.get(max).value;A.get(max).value= A.get(newInstance).value;A.get(newInstance).value = temp1;temp2 = A.get(max).direction;A.get(max).direction= A.get(newInstance).direction;A.get(newInstance).direction = temp2;}public void produce(ArrayList<Vector> A){outputArray(A);System.out.println();while(isMoveExist(A)){swap(A,toSearchMax(A));outputArray(A);System.out.println();}} public void outputArray(ArrayList<Vector> A){for(int i = 0;i < A.size();i++){System.out.print(A.get(i).value);}}public static void main(String[] args){ArrayList<Vector> vector = new ArrayList<Vector>();Vector v1 = new Vector();v1.value = 1;v1.direction = -1;vector.add(v1);Vector v2 = new Vector();v2.value = 2;v2.direction = -1;vector.add(v2);Vector v3 = new Vector();v3.value = 3;v3.direction = -1;vector.add(v3);//Vector v4 = new Vector();//v4.value = 4;//v4.direction = -1;//vector.add(v4);JohnsonTrotter jt = new JohnsonTrotter();jt.produce(vector);}}class Vector{public int direction;public int value;public boolean isMove;public Vector(){}public Vector(int direction,int value,boolean isMove){this.direction = direction;this.value = value;this.isMove = isMove;}}

上面给的实现测试例子中只用了三个数来做实验,一面结果太多难以穷举。

结果如下:

123
132
312
321
231
213

 

原创粉丝点击