之前一直在找一个经典的全排列算法,后得知STL中就有,根据它的原理写了个样例,发现即使元素有重复的情况下得出的全排列也不会包含重复序列。在此记录一下。
函数实现原理如下:
在已经从小到大排序好的当前序列中,从尾端往前寻找两个相邻元素,前一个记为*i,后一个记为*ii,并且满足*i < *ii。然后再从尾端寻找另一个元素*j,如果满足*i < *j,即将第i个元素与第j个元素对调,并将第ii个元素之后(包括ii)的所有元素颠倒排序,即求出下一个序列了。
代码如下:
public class quanPaiLie {
public static void main(String[] args) {
char x[]={'b','a','b','c'};
sort(x);
System.out.println(x);
paiLie(x);
}
private static void paiLie(char[] x) {
int end=0;
for(int i=0;i<x.length-1;i++){
if(x[i]>=x[i+1])
end=i+1;
else break;
}
if(end==x.length-1)
return;
int k=0,kk=0,t=0;
char temp;
for(int i=x.length-2;i>=0;i--){
if(x[i]<x[i+1]){
k=i;
kk=i+1;
break;
}
}
for(int i=x.length-1;i>=0;i--){
if(x[i]>x[k]){
t=i;
break;
}
}
temp=x[k];
x[k]=x[t];
x[t]=temp;
for(int i=kk,j=x.length-1;i<j;i++,j--){
temp=x[i];
x[i]=x[j];
x[j]=temp;
}
System.out.println(x);
paiLie(x);
}
private static void sort(char[] x) {
char min;
int loc,i,j;
for(i=0;i<x.length;i++){
min=x[i];
loc=i;
for(j=i+1;j<x.length;j++){
if(x[j]<min){
min=x[j];
loc=j;
}
}
x[loc]=x[i];
x[i]=min;
}
}
}