1. 程式人生 > >按照字典排序,生成1-n佇列(java實現)

按照字典排序,生成1-n佇列(java實現)

按照字典排序,就是按照從小大排序,包括序號中的每一個數字。

例如輸入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);
	}
}