所以我正在从一门课程中做一些任务,我将把它作为练习,因为教授似乎把它们留在了网上。但是,我目前正在进行的任务让我难以理解如何找到n个数字的所有排列。他给了我们sudo代码但是我在翻译它时遇到了困难。
public void nextPerm(int[] a,int pivot,int suc){
suc = 0;
pivot = 0;
for(int i = a.length-1;; i--){
if( i+1 != a.length)
if(a[i] < a[i+1]){
pivot = i;
break;
} else if(pivot == 0){
reverseArray(a,pivot);//this just reverses the array from the right of the pivot point
System.out.println(a);
}
}
for(int i = a.length-1;;i--){
if(a[i] > a[pivot]){
suc = i;
break;
}
}
//swap pivot and suc
int place = a[pivot];
a[pivot] = a[suc];
a[place] = a[pivot];
reverseArray(a,pivot);
System.out.println(Arrays.toString(a));
}
private void reverseArray(int[] a,int pivot) {//make pivot the index which it will reverse to the right of
// TODO Auto-generated method stub
int[] place = new int[a.length-pivot-1];
int counter = 0;
for(int i = a.length-1; i > pivot;i--){
place[counter] = a[i];
counter++;
}
counter = 0;
int[] hold = new int[a.length];
for(int i = 0; i <= pivot;i++){
hold[i] = a[i];
counter++;
}
for(int i = 0; i < place.length;i++){
hold[counter] = place[i];
counter++;
}
System.out.println(Arrays.toString(hold));
}
这是我到目前为止所拥有的。基本上每次运行nextPerm时,它都会将数组调整为另一个排列。有关详情,请查看此处的页面:link to more info
摘要:nextPerm通过手动更改数组一次找到所有可能的perms。如果我不清楚,我很抱歉...我很新手。我也对此进行了研究,但是我并没有在这方面取得任何进展并且在努力。谢谢你提前。
答案 0 :(得分:0)
您只需要将上一步中获得的输出作为输入传递给下一步,直到迭代所有可能的排列。这是一个解释和伪代码。
假设你有一个数组[1,2,3,4]
。阵列中4个元素可能的总排列数为4!假设所有元素都是不同的。所以,只需迭代上面的nextPerm 4代码!次。
int fact = factorial(array.length);
for(int i = 0;i<fact;i++){
int[] b = nextPerm(array);
array = b;
}
假设你的nextPrem返回下一个置换数组。