思路
我们先把要排列的元素存到一个数组中,然后从第0位开始往后逐个确认每个位置的元素。而这个待确定的位置的元素可以是从当前位置开始往后的任意元素,我们就从当前位置开始往后选,每次选一个,将选中的元素放到这个待确定的位置上,即将他俩交换。这个位置确认后,我们就继续确认下一个位置。这样只是一种情况,我们应该回溯(相当于恢复原态,就是说我不要刚刚选的那个元素,我要选择其他还没被选过的元素),然后再给那个待确定的位置选择其他元素,直到从它开始往后的每个元素都被我们选过。当待确定的位置超出了数组下标,说明现在已经生成了一种排列。下面我们看实现代码:
/**
* @param arr:将排列的元素存在数组arr中
* @param decision:表示现在要确定第几位
*/
public static void fullPermutation(char[] arr, int decision) {
// 有效性判断
if (arr == null || decision < 0 || decision > arr.length)
return;
// 如果现在要确定的位置已经超出了数组下标,说明现在已经生成了一种排列
if (decision == arr.length) {
System.out.println(new String(arr));
return;
}
// 现在要确定的位置的元素可以是数组中从当前位置开始往后的任意元素
for (int i = decision; i < arr.length; i++) {
// 将选取的元素放入当前要确定的位置中
{
char t = arr[decision];
arr[decision] = arr[i];
arr[i] = t;
}
// 确定后继续确定下一个位置
fullPermutation(arr, decision + 1);
// 回溯
{
char t = arr[decision];
arr[decision] = arr[i];
arr[i] = t;
}
}
}