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<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");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值