刷题!刷题!发现对于数组元素的全排列很多题目都有涉及到,所以详细研究一下
对一个数组进行全排列,我们可以这样考虑,我们获得了在第一个位置上的所有情况之后,抽去数组中的第一个位置,那么对于剩下的数组可以看成是一个全新的序列,这个序列可以认为是与之前的序列毫无关联了。同样的,我们可以对这个序列进行与之前相同的操作,直到序列中只有一个元素为止。这样我们就获得了所有的可能性。这是一个递归算法。
package suanfa;
public class Quanpailie {
public static void arrage(int[] list, int start, int length) {
int i;
if (start == length) {
for (i = 0; i < length; i++)
System.out.print(list[i] + " ");
System.out.println();
} else {
for (i = start; i < length; i++) {
swap(list, start, i);
arrage(list, start + 1, length);
swap(list, start, i);//这里是因为我们每一次如果我们要假定第一位的所有可能性的话,那么就必须是在建立在这些序列的初始状态一致的情况下,所以要回归状态
}
}
}
public static void swap(int[] list, int start, int i) {
int temp;
temp = list[start];
list[start] = list[i];
list[i] = temp;
}
public static void main(String[] args) {
int length = 3;
int start = 0;
int list[] = new int[length];
for (int j = 0; j < length; j++)
list[j] = j + 1;
arrage(list, start, length);
}
}
结果
1 2 3
1 3 2
2 1 3
2 3 1
3 2 1
3 1 2
网友评论