全排列非递归算法记得以前有更"好"的算法(在李立新老师的书或讲义上看到过),但是当时我勉强理解了,现在又不论如何记不起来了。
所以想了很久(。。。)以后,决定用这个“全排列非递归递增的Java算法”。由于是递增的,思路比较简单。
public class OrderIterator implements Iterator {
private int[] buf;
private int size;
private boolean end=false;
public OrderIterator(int size) {
this.size = size;
buf = new int[size];
for (int i = 0; i < size; i++) {
buf[i] = i;
}
}
public boolean hasNext() {
return !end;
}
public Object next() {
int res[] = new int[size];
System.arraycopy(buf, 0, res, 0, size);
goNext();
return res;
}
/**next most min value that max than current value*/
private void goNext() {
int p= findHill();
if (p==0){
end=true;
return;
}
adjust(p-1);
}
/** adjust within this area*/
private void adjust(int p) {
int v = buf[p];
Arrays.sort(buf,p,size);
// find p's new position
int i;
for (i=p;i<size;i++){
if (buf[i]==v){
break;
}
}
move(i+1,p);
}
/**move q to p, q should lt p*/
private void move(int q, int p) {
int t=buf[q];
for (int i=q;i>p;i--){
buf[i]=buf[i-1];
}
buf[p]=t;
}
/** increase seq from tail to head*/
private int findHill() {
int p=size-1;
while(p>0 && buf[p-1]>buf[p]){
p--;
}
return p;
}
public void remove() { // not support
}
public static void main(String[] args) {
OrderIterator order = new OrderIterator(4);
int count=0;
while (order.hasNext()) {
count++;
int[] arr = (int[]) order.next();
for (int i = 0; i < arr.length; i++) {
System.out.print((arr[i]+1) + ",");
}
System.out.println();
}
System.out.println("count="+count);
}
}
-----
没有评论:
发表评论