Java實現陣列的全排列
阿新 • • 發佈:2019-01-08
一、思路
第一步:將得到的陣列從小到大進行排序。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");
}
}