一、思路
第一步:将得到的数组从小到大进行排序。Arrays.sort(array);使array变成(例如12345这种顺序)。
————进入死循环
第二步:打印出当前数组(第一次的话应该是12345)。
第三步:从右往左找到第一个逆序的数,记录下标为index(如第一次的话5比4大,所以应该是4,index=3)。若这个数组完全逆序(如已经变成54321这种,即index<=0),则表示已经输出完毕,退出。
第四步:从右往左找到第一个比array[index]大的数,然后交换这个数和index处的数的值。(如5>4,交换5和4,数组成为12354)。这一步是肯定可以找到并完成交换的。
第五步::将array数组的从index+1下标处开始的之后的数进行逆序排序。
————死循环
二、具体实现(Java)
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
System.out.println("请输入待排列的数据总个数:");
Scanner in = new Scanner(System.in);
int size = in.nextInt();
int [] daysList = new int [size];
for(int i =0; i<size;i++){
System.out.println("请输入第"+(i+1)+"个数:");
daysList[i]=in.nextInt();
}
permute(daysList,0);
}
public static void permute(int[] array,int start){
Arrays.sort(array);//先排个序
int index = 0;
while(true) {
printArray(array);//输出
//从右往左寻找第一个逆序
for(int i = array.length-2;i>=0;i--) {
if(array[i]<array[i+1]) {
index=i;//找到第一个逆序下标
break;
}else if(i<=0) {//若不存在逆序,即到了例如54321这种排列,则说明排列完了
return;
}
}
//到这里找到了第一个逆序的下标,应该将这个下标的数字与,从右往左第一个大于该数字的数交换
for(int i=array.length-1;i>=0;i--) {
if(array[i]>array[index]) {
swap(array,i,index);//交换
break;
}
}
//接下来将index之后的数据逆序排列
reverse(array,index+1);
}
}
/**
* 将输入的数组反过来(逆序)
* @param array 待逆序的数组
* @param i 逆序开始的下标(该下标之前的数据不会变)
*/
public static void reverse(int array[],int i)
{
int k=i,j=array.length-1;
while(k<j)
{
swap(array,k,j);
k++;
j--;
}
}
/**
* 交换array[s]和array[i]的数据
* @param array
* @param s
* @param i
*/
private static void swap(int[] array,int s,int i){
int t=array[s];
array[s]=array[i];
array[i]=t;
}
/**
* 将array打印出来
* @param array
*/
private static void printArray(int[] array) {
for(int i=0;i<array.length;i++) {
System.out.print(array[i]);
}
System.out.print("\n");
}
}