1. 程式人生 > >Java實現陣列的全排列

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"); } }