Java實現排列組合算法

用Java實現排列算法:

package Sort;

import java.util.ArrayList;
import java.util.List;

public class Arrange {
	public static void main(String[] args) {
		Arrange arrange = new Arrange();
		List<Character> data = new ArrayList<Character>();
		data.add('a');
		data.add('b');
		data.add('c');
		data.add('d');
		
		//輸出A(n,n)的全排列
		for(int i = 1; i <= data.size(); i++)
			arrange.arrangeSelect(data,new ArrayList<Character>(),i);

	}
	
	/**
	 * 計算A(n,k)
	 * 
	 * @param data
	 * @param target
	 * @param k
	 */
	public <E> void arrangeSelect(List<E> data,List<E> target, int k) {
		List<E> copyData;
		List<E> copyTarget;
		if(target.size() == k) {
			for(E i : target) 
				System.out.print(i);
			System.out.println();
		}
	
		for(int i=0; i<data.size(); i++) {
			copyData = new ArrayList<E>(data);
			copyTarget = new ArrayList<E>(target);
			
			copyTarget.add(copyData.get(i));
			copyData.remove(i);
			
			arrangeSelect(copyData, copyTarget,k);
		}
	}

}
</pre><pre name="code" class="java">Java實現組合算法

package Sort;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
 * 求在M中找出N的排列數
 * 算法思想:遞歸
 *  eg:abcd的全排列結果分別爲:a,b,c,d,ab,ac,ad,bc,bd,cd,abc,abd,acd,bcd,abcd
 *  可以看出,當求N位的組合數時,可以先固定前N-1位,然後在匹配最後一位可行值;以此類推可用遞歸的方法求出所有可能的值。
 *   
 * @author YHYR
 *
 */

public class Combine {
	
	public static void main(String[] args) {
		List<Character> data = new ArrayList<Character>();
		data.add('a');
		data.add('b');
		data.add('c');
		data.add('d');
		Combine t = new Combine();
		
		for(int i = 1; i < data.size(); i++)
		t.combinerSelect(data, new ArrayList<Character>(), data.size(), i);
	}
	
	/**
	 * 步驟::每次遞歸時,把原始數據和滿足條件的工作空間複製一份,所有的操作均在複製文件中進行,目的就是保證不破壞原始數據,
	 * 		從而可以讓一輪遞歸結束後可以正常進行下一輪。
	 * 		其次,把數據的第一個元素添加到工作空間中,判斷工作空間的大小,如果小於k,則需要繼續遞歸,但此時,傳入遞歸函數的
	 * 		參數需要注意:假設當前插入的節點的下標是i,因爲是順序插入的,所以i之前的所有數據都應該捨去,只傳入i之後的未使用過的數據。
	 * 		因此在傳參之前,應該對copydata作以處理;當大於k的時候,則表明已經找到滿足條件的第一種情況,然後只需修改該情況的最後一個結果即可。
	 * 		如:找到abc時,則只需替換c爲d即可完成該輪遞歸。
	 * 
	 * @param data	原始數據
	 * @param workSpace	自定義一個臨時空間,用來存儲每次符合條件的值
	 * @param k		C(n,k)中的k
	 */
	public <E> void combinerSelect(List<E> data, List<E> workSpace, int n, int k) {
		List<E> copyData;
		List<E> copyWorkSpace;
		
		if(workSpace.size() == k) {
			for(Object c : workSpace)
				System.out.print(c);
			System.out.println();
		}
		
		for(int i = 0; i < data.size(); i++) {
			copyData = new ArrayList<E>(data);
			copyWorkSpace = new ArrayList<E>(workSpace);
			
			copyWorkSpace.add(copyData.get(i));
			for(int j = i; j >=  0; j--)
				copyData.remove(j);
			combinerSelect(copyData, copyWorkSpace, n, k);
		}
		
	}
	
}


發佈了42 篇原創文章 · 獲贊 73 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章