**字典算法**是求全排列的一个算法,即给出数组{1,2,3}求出其所有的全排列。具体的思想是首先从右到左找出右边的数比左边数大的记录下来记为list[a],然后再从右向左找一个大于list[a]的数,记为list[b],然后交换两个数,最后从list[a]后面的一个数进行排序,从小到大的顺序,以此循环最终得到最后的全排列。
下面就是执行的代码:
public class Dicticorary {
public static void main(String[] args) {
int[] list = new int[]{1,2,3,4};
prim(list,4)
}
private static void prim(int[] list, int n) {
//所有的全排列都是n! 所以有n!次
int num = 1;
int a=0,b=0;
for (int t=n; t>0; t--)
num = num * t;
while (num>0){
for (int i =0; i<n; i++){
System.out.print(list[i]);
}
System.out.println("\n");
//从右向左找出第一个左边小于右边的数
for(int j=n-1; j>0; j-- ){
if (list[j-1]<list[j]){
a = j-1;
break;
}
}
//从右向左找出第一个大于list[j-1]的数
for (int k=n-1; k>0 ; k--){
if (list[k]>list[a]){
b = k;
break;
}
}
Swap(list , a ,b);
Sort(list , a , n);
num--;
}
}
private static void Swap(int[] list, int a, int b) {
int tmp;
tmp = list[a];
list[a] = list[b];
list[b] =tmp;
}
// 后面的数从小到大排列