按照字典排序,生成1-n佇列(java實現)
阿新 • • 發佈:2019-02-15
按照字典排序,就是按照從小大排序,包括序號中的每一個數字。
例如輸入3,字典排序就是
1,2,3,
1,3,2,
2,1,3,
2,3,1,
3,1,2,
3,2,1,
對於1,2,3和1,3,2來說,顯然除了第一個是1外,1後面也按照字典排序。
於是題目就是:輸入一個n(1-9),生成最大數為n的字典排序
思路:從題目分析可以看出,應該使用遞迴的方法。假設我們已經確定了前k個數字,後面的數字也是要按字典排序,將前k個數字,與後面數字的字典排序結合起來,就可以得出結果。按照遞迴的思路,我們假設我們已經擁有了一個print_permutation(int n,int[] a,int cur)方法,這個方法第一個引數是我們輸入的n,第二個引數是已經按照字典排序拍好的cur個數字,cur就是a裡面有多少個數字已經按字典排序拍好
假設n=9,那麼我們拿著這個方法,我確定第一位,是從1到9,然後可以呼叫print_permutation(8,arr,0),就可以生產後面八位。
那麼要幾時print_permutation(8,arr,0),也就是n=8,我們同樣確定第一位(注意,這裡的第一位不能等於n=9時確定的第一位,所以程式裡面加了加個判斷),然後呼叫
print_permutation(7,arr,0)
以此類推,我們最後呼叫print_permutation(1,arr,0)就可以結束遞迴
public class Test { public static void print_permutation(int n,int[] a,int cur){ if(cur == n){//如果當前數目為總數,輸出 for(int i=1;i<n;i++){ System.out.print(a[i]+","); } System.out.println(); }else{ for(int i=1;i<n;i++){//逐個查詢數字 boolean OK = true;; for(int j=1;j<cur;j++){//判斷數字是否已經在序列中 if(i == a[j]){ OK = false; break; } } if(OK){//如果不在序列中 a[cur] = i;//將數字加入序列 print_permutation(n, a, cur+1);//遞迴呼叫 } } } } public static void main(String[] args) { int total = 3; int[] arr = new int[total+1]; print_permutation(total+1, arr, 0); } }