算法思想:
1.以一组排列数字排序之后作为起始数:譬如1,2,3,4 而不是2,1,3,4
2.从右向左查找一个数字(这个数字要比它前面的数字大)
如: 1234 你就会找到4
1243 你就会找到4 ......
3.从右向左查找一个第一个可交换数字(该数字要满足比第二步找到的数字小,却比第二步找到的数字的前一个数字大)
4.交换第二步找到的数字的前一个数字与第三步找到的数字;
5.将第二步找到的数字右边的数字排序;6.over,收工这样的几步就得到了下一个全排列数字~~~【希望有更好的想法的拿出来分享,一起探讨,非递归全排列算法】
package Demon;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
//全排列算法实现
int[] arr = new int[]{1,2,3,4};
for(int i :arr)
{
System.out.print(i + " ");
}
System.out.println();
int totalnum = 1;
while(NextNumber(arr,arr.length))
{
for(int i :arr)
{
System.out.print(i + " ");
}
System.out.println();
totalnum ++;
}
System.out.println("Total Num: " + totalnum);
}
/**
* 根据传入的数组获取下一个数组
* @param arr 传入数组
* @param n 数组长度
* @return 是否有下一个值
*/
private static Boolean NextNumber(int[] arr, int n)
{
//数组最后一个元素位置
int lastIndex = n-1;
//从右向左确定第一个数字(前面的数字比它小)
int firstIndex = lastIndex;
for(;arr[firstIndex-1]>arr[firstIndex];firstIndex--)
{
if(firstIndex == 1)
{
//已经轮询完毕,此数已经是最大的那个数
return false;
}
}
//从右向左确定一个交换数(此数比arr[firstIndex]小且比arr[firstIndex-1]大)
int swapIndex = lastIndex;
for(;swapIndex > firstIndex;swapIndex--)
{
if(arr[swapIndex] < arr[firstIndex] && arr[swapIndex] > arr[firstIndex-1])
{
break;
}
}
//交换数字
swap(arr,firstIndex-1,swapIndex);
//将firstIndex右边的数字排序
for(;firstIndex < lastIndex;firstIndex++,lastIndex--)
{
if(arr[firstIndex] > arr[lastIndex])
{
swap(arr,firstIndex,lastIndex);
}
}
return true;
}
/**
* 交换数组中第i个元素与第j个元素的值
* @param arr 传入数组
* @param i 位置1
* @param j 位置2
*/
private static void swap(int[] arr,int i, int j)
{
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}