84 lines
2.0 KiB
Java
84 lines
2.0 KiB
Java
public class PermutationGenerator {
|
|
private int[] array;
|
|
private int firstNum;
|
|
private boolean firstReady = false;
|
|
|
|
public PermutationGenerator(int n, int firstNum_) {
|
|
if (n < 1) {
|
|
throw new IllegalArgumentException("The n must be min. 1");
|
|
}
|
|
firstNum = firstNum_;
|
|
array = new int[n];
|
|
reset();
|
|
}
|
|
|
|
public void reset() {
|
|
for (int i = 0; i < array.length; i++) {
|
|
array[i] = i + firstNum;
|
|
}
|
|
firstReady = false;
|
|
}
|
|
|
|
public boolean hasMore() {
|
|
boolean end = firstReady;
|
|
for (int i = 1; i < array.length; i++) {
|
|
end = end && array[i] < array[i-1];
|
|
}
|
|
return !end;
|
|
}
|
|
|
|
public int[] getNext() {
|
|
|
|
if (!firstReady) {
|
|
firstReady = true;
|
|
return array;
|
|
}
|
|
|
|
int temp;
|
|
int j = array.length - 2;
|
|
int k = array.length - 1;
|
|
|
|
// Find largest index j with a[j] < a[j+1]
|
|
|
|
for (;array[j] > array[j+1]; j--);
|
|
|
|
// Find index k such that a[k] is smallest integer
|
|
// greater than a[j] to the right of a[j]
|
|
|
|
for (;array[j] > array[k]; k--);
|
|
|
|
// Interchange a[j] and a[k]
|
|
|
|
temp = array[k];
|
|
array[k] = array[j];
|
|
array[j] = temp;
|
|
|
|
// Put tail end of permutation after jth position in increasing order
|
|
|
|
int r = array.length - 1;
|
|
int s = j + 1;
|
|
|
|
while (r > s) {
|
|
temp = array[s];
|
|
array[s++] = array[r];
|
|
array[r--] = temp;
|
|
}
|
|
|
|
return array;
|
|
} // getNext()
|
|
|
|
// For testing of the PermutationGenerator class
|
|
public static void main(String[] args) {
|
|
PermutationGenerator pg = new PermutationGenerator(3, 1);
|
|
|
|
while (pg.hasMore()) {
|
|
int[] temp = pg.getNext();
|
|
for (int i = 0; i < temp.length; i++) {
|
|
System.out.print(temp[i] + " ");
|
|
}
|
|
System.out.println();
|
|
}
|
|
}
|
|
|
|
} // class
|