Java实现数组的全排列

一、思路

第一步:将得到的数组从小到大进行排序。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"请输入第"+(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]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/**
     * 交换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"\n");
    }
}

你可能感兴趣的:(Java实现数组的全排列)