import java.util.Arrays;
/*理解全排序的过程,从begin到i-1的数据都与begin交换过,
如果第i的数据与前面begin到i-1中的数据有重复,那么不用交换了
设 a[i]=x 存在 a[j]=x , begin<=j<=i-1
根据 全排列的递归公式知道 Perm(Ri)=Perm(Rj)
所以 Perm(Ri)为重复的需要去掉 */
public class sortRAll {
// static String[] array = { "x", "y", "z" };
public static void main(String[] args) {
String[] array = { "1", "2", "2","3"};
getAllOrder(array,0, array.length - 1);
}
public static void getAllOrder(String[] array,int begin, int end) {
if (begin == end) {
check(array);
} else {
String s=new String();
/*for(int i=0;i<array.length;i++)
s=s+array[i];*/
for(int i=begin;i<end+1;i++)
s=s+array[i];
int index[]=new int[s.length()];
for(int i=0;i<s.length();i++)
index[i]=s.indexOf(s.charAt(i)); //index[i]<=i
for (int i = begin; i <= end; i++) {
// 交换数据
if(i-begin==index[i-begin]) //如果有重复 ,index[i]<i 则不交换
{
swap(array,begin, i);
getAllOrder(array,begin + 1, end);
swap(array,i, begin);
}
}
}
}
public static void swap(String[] array,int from, int to) {
// 这里应该加上各种防止无效交换的情况
// 比如位置相同,或者2个位置的数据相同
if (from == to) {
return ;
}
String tmp = array[from];
array[from] = array[to];
array[to] = tmp;
}
public static void check(String[] array) {
// 排列拿到了,可以进行你的判断了。
System.out.println(Arrays.toString(array));
}
}
/*理解全排序的过程,从begin到i-1的数据都与begin交换过,
如果第i的数据与前面begin到i-1中的数据有重复,那么不用交换了
设 a[i]=x 存在 a[j]=x , begin<=j<=i-1
根据 全排列的递归公式知道 Perm(Ri)=Perm(Rj)
所以 Perm(Ri)为重复的需要去掉 */
public class sortRAll {
// static String[] array = { "x", "y", "z" };
public static void main(String[] args) {
String[] array = { "1", "2", "2","3"};
getAllOrder(array,0, array.length - 1);
}
public static void getAllOrder(String[] array,int begin, int end) {
if (begin == end) {
check(array);
} else {
String s=new String();
/*for(int i=0;i<array.length;i++)
s=s+array[i];*/
for(int i=begin;i<end+1;i++)
s=s+array[i];
int index[]=new int[s.length()];
for(int i=0;i<s.length();i++)
index[i]=s.indexOf(s.charAt(i)); //index[i]<=i
for (int i = begin; i <= end; i++) {
// 交换数据
if(i-begin==index[i-begin]) //如果有重复 ,index[i]<i 则不交换
{
swap(array,begin, i);
getAllOrder(array,begin + 1, end);
swap(array,i, begin);
}
}
}
}
public static void swap(String[] array,int from, int to) {
// 这里应该加上各种防止无效交换的情况
// 比如位置相同,或者2个位置的数据相同
if (from == to) {
return ;
}
String tmp = array[from];
array[from] = array[to];
array[to] = tmp;
}
public static void check(String[] array) {
// 排列拿到了,可以进行你的判断了。
System.out.println(Arrays.toString(array));
}
}