刷題腰埂!刷題仇让!發(fā)現(xiàn)對(duì)于數(shù)組元素的全排列很多題目都有涉及到,所以詳細(xì)研究一下
對(duì)一個(gè)數(shù)組進(jìn)行全排列酝掩,我們可以這樣考慮鳞芙,我們獲得了在第一個(gè)位置上的所有情況之后,抽去數(shù)組中的第一個(gè)位置期虾,那么對(duì)于剩下的數(shù)組可以看成是一個(gè)全新的序列原朝,這個(gè)序列可以認(rèn)為是與之前的序列毫無(wú)關(guān)聯(lián)了。同樣的镶苞,我們可以對(duì)這個(gè)序列進(jìn)行與之前相同的操作喳坠,直到序列中只有一個(gè)元素為止。這樣我們就獲得了所有的可能性茂蚓。這是一個(gè)遞歸算法壕鹉。
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);//這里是因?yàn)槲覀兠恳淮稳绻覀円俣ǖ谝晃坏乃锌赡苄缘脑挘敲淳捅仨毷窃诮⒃谶@些序列的初始狀態(tài)一致的情況下煌贴,所以要回歸狀態(tà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);
}
}
結(jié)果
1 2 3
1 3 2
2 1 3
2 3 1
3 2 1
3 1 2