使用递归和迭代的组合比纯迭代更容易创建(或打印)数组的排列。当然,可以通过迭代方式完成,但与组合相比,它特别简单。具体来说,需要注意一个长度为N的数组的定义是有N!种排列方式 - 第一个位置有N个选择,第二个位置有N-1个选择,以此类推。因此,我们可以将算法分解为两个步骤
对于数组中的每个索引i。
- 从子数组arr[i....end]中选择一个元素作为数组的第i个元素。将该元素与当前位于arr[i]的元素交换。
- 递归地对arr[i+1...end]进行排列。
我们注意到这将在O(N!)下运行,因为在第1次调用中将进行N个子调用,每个子调用将进行N-1个子调用等等。此外,每个元素最终都会出现在每个位置上,并且只要进行交换,就不会重复任何元素。
public static void permute(int[] arr){
permuteHelper(arr, 0);
}
private static void permuteHelper(int[] arr, int index){
if(index >= arr.length - 1){
System.out.print("[");
for(int i = 0; i < arr.length - 1; i++){
System.out.print(arr[i] + ", ");
}
if(arr.length > 0)
System.out.print(arr[arr.length - 1]);
System.out.println("]");
return;
}
for(int i = index; i < arr.length; i++){
int t = arr[index];
arr[index] = arr[i];
arr[i] = t;
permuteHelper(arr, index+1);
t = arr[index];
arr[index] = arr[i];
arr[i] = t;
}
}
样例输入和输出:
public static void main(String[] args) {
permute(new int[]{1,2,3,4});
}
[1, 2, 3, 4]
[1, 2, 4, 3]
[1, 3, 2, 4]
[1, 3, 4, 2]
[1, 4, 3, 2]
[1, 4, 2, 3]
[2, 1, 3, 4]
[2, 1, 4, 3]
[2, 3, 1, 4]
[2, 3, 4, 1]
[2, 4, 3, 1]
[2, 4, 1, 3]
[3, 2, 1, 4]
[3, 2, 4, 1]
[3, 1, 2, 4]
[3, 1, 4, 2]
[3, 4, 1, 2]
[3, 4, 2, 1]
[4, 2, 3, 1]
[4, 2, 1, 3]
[4, 3, 2, 1]
[4, 3, 1, 2]
[4, 1, 3, 2]
[4, 1, 2, 3]
int[] B = new int[pivot+1]; reverseArray(B);
?这会将零数组反转,不是吗?reverseArray(A)
- 这看起来也很奇怪...我建议你使用我的答案中的实现,我已经进行了充分测试,它可以按预期工作。 - dened