对整数进行全排列:
import java.util.Arrays;
public class Permul2 {
/**
一个排列的开始:1234结束:4321
全排列思想:
第一次排 的时候我们会先选择把最后的两个数进行排列即3 4 和 4 3
1 2 3 4 判断 3 4 不是降序的,将其交换
1 2 4 3 最后两位数是“降序”、所以 3 4排列可能已经完了我们要拿2组合排列
让2与其后面大于他的最小的数交换即最后一位3,即3 4 2;然后在将第3位与第4位升序,即3 2 4
1 3 2 4
1 3 4 2
1 4 2 3
1 4 3 2 最后三位数是降序的了继续往前拿一位进行排列,将1与大于它的对最小的数交换即最后一位2交换,再让其升序
2 1 3 4
*/
public boolean nextperm(int[] array){
//数组长度小于1不用进行排列
if(array.length<=1){
return false;
}
//从后往前找,找到第一个不满足降序的数(要考虑到重复的数字)
int i = array.length-2;
//考虑到重复的数字,所以要满足array[i]=array[i+1]
for(;i>=0&&array[i]>=array[i+1];i--){
}
if(i==-1){
return false;
}
//从i开始往后找到大于arr[i]的最小的数
int j =i+1;
for(;j<array.length&&array[j]>array[i];k++){
}
//交换array[i]和array[j-1]
swap(array,i,j-1);
//重新对array[i]后面的数排序,接下来继续进行全排列操作
Arrays.sort(array,j+1,array.length);
return true;
}
public void swap(int[] array,int i,int k){
int temp;
temp = array[i];
array[i] = array[k];
array[k] = temp;
}
public static void main(String[] args) {
int[] a = {1,1,2,3};
Permul2 p = new Permul2();
do{
for(int i=0;i<a.length;i++){
System.out.print(a[i]);
}
System.out.println();
}while(p.nextperm(a));
}
}