いくつかの異なるアルゴリズムは子供の頃遊んだトランプゲームを実現します


小さい时に他の人が游んでいるゲームを见て、彼に一定の大きさの顺番のトランプを数えて、毎回底を置く個数を指定して、彼が顺番を调整した后に、先に底を置いてもう1枚のトランプを出すことができて、このように押して、トランプがすべて出てくるまで、大きいから小さいまであるいは小さいから大きいまで一つ一つ出てくることができて、どのように出てきたのですか?当時は不思議に思っていましたが、大人になってから考えたり調べたりして方法を知り、いくつかのアルゴリズムで実現しました!
 
以下はjavaで実装されたプログラムです.

/**
 *     :     ,             ,    
 *    1 2 3 4    
 *          
 */
package com.mcfeng.base;

/**
 * @author microjava
 * 
 * 2008-12-29  12:46:15
 * 
 */
public class Pukepai {

	private final static int PAI_NUM = 13;

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		//   
		// System.out.println(adNum(13));

		//             ,          (     1)     0     1     
		sort(13, 1, 0);
		
		//   
		sortByNitui(13,3,true);
		
		//      
		/*int num = 3;
		while(num++ < 1000) {
			sort(num, 1, 0);
			sortByTang(num);
		}
		*/

	}

	/**
	 *    n + n/2 + n/4 + ... + 1          
	 */
	public static int adNum(int n) {
		int m = 0;
		for (int i = n; i > 0;) {
			// System.out.println(i);
			m += i;
			if (i == 1)
				break;
			if (i % 2 == 0)
				i = i / 2;
			else
				i = (i / 2) + 1;

		}
		return m;
	}

	/**
	 *    
	 *      ,          : paiNum    hNum          l       (0    ,1    )
	 */
	public static int[] sort(int paiNum, int hNum, int l) {
		if(paiNum <= 1)  {
			int [] res = {1};
			return res;
		}

		int total = adNum(paiNum);
		int[] a = new int[total]; //                      n + n/2 +
		// n/4 + ... + 1  
		int[] b = new int[paiNum]; //       

		int[] c = new int[paiNum]; //       

		//     
		for (int i = 0; i < paiNum; i++) {
			a[i] = i + 1;
			
		}

		//      
		int st = 0;                     //    
		int bj = 0;                     //        
		int aj = paiNum;                //        
		while(true) {
			b[bj++] = a[st++];
			if(a[st + 1] == 0) {
				b[bj] = a[st];
				break;
			}
			a[aj++] = a[st++];
		}
		
		//           
		for (int i = 0; i < b.length; i++) {
			c[b[i] - 1] = i + 1;
		}

		System.out.println("        ");
		for (int i : c) {
			System.out.print(i + " ");
		}
		return c;

	}
	
	/**
	 *    
	 *      ,          : paiNum    
	 * hNum          flag       (true    ,false    )
	 * */
	public static int[] sortByNitui(int paiNum,int hNum,boolean flag) {
		int[] a = new int[paiNum];  //    
		int[] b = new int[paiNum];  //    
		
		//     
		for (int i=0;i<paiNum;i++) {
			a[i] = paiNum - i;
		}
		
		int ed = paiNum - 1,st = 0;
		//             
		/*while(ed >= 0) {
			b[ed] = a[st];
			if(ed == 0 && l == 0) break;
			if(ed < paiNum - 1) {
				int temp =b[paiNum - 1];
				for(int i = paiNum - 2;i >= ed;i--) {
					b[i + 1] = b[i];
				}
				b[ed] = temp;
				
			}
			
			st++;
			ed--;
			
		}*/
		
		//             
		int[] temp = new int[hNum];
		while(ed >= 0) {
			
			b[ed] = a[st];
			
			if(ed == 0 && flag) break;
			
			if(ed >= paiNum - hNum && ed < paiNum -1 && hNum > 2) {
				int temphNum = hNum%(st + 1);
				
				for(int i = 0;i< temphNum; i++) {
					temp[i] = b[paiNum - i -1];
				}
			
				for(int i = paiNum - 1 - temphNum;i >= ed;i--) {
					b[i + temphNum] = b[i];
				}
				
				for(int i =0;i<temphNum;i++) {
					b[ed + i] = temp[temphNum - i - 1];
				}
				
			}
			
			else if(ed < paiNum - hNum) {
				
				for(int i = 0;i< hNum; i++) {
					temp[i] = b[paiNum - i -1];
				}
			
				for(int i = paiNum - 1 - hNum;i >= ed;i--) {
					b[i + hNum] = b[i];
				}
				
				for(int i =0;i<hNum;i++) {
					b[ed + i] = temp[hNum - i - 1];
				}
				
			}
			
			st++;
			ed--;
		}
		
		/*System.out.println("
:"); for (int i : b) { System.out.print(i + " "); }*/ return b; } /** * */ public static void sortByTang(int num) { int sum, j = 0, k = num; int head = 0, tail = 0; System.out.println(); sum = adNum(k); System.out.println(sum); head = 0; tail = k; int[] init = new int[sum]; System.out.println("init:" + sum); // for (int i = 0; i < k; i++) init[i] = i + 1; for (int i = 0; i < k; i++) { System.out.print(init[i]); System.out.print(" "); } int[] a = new int[k + 1]; while (head != tail) { a[j++] = init[head]; if (head + 1 == tail) { //a[j] = init[tail]; break; } init[tail++] = init[head + 1]; head += 2; } System.out.println(); System.out.println("after del:"); for (int i = 0; i < j; i++) { System.out.print(a[i]); System.out.print(" "); } int[] out = new int[k]; for (int i = 0; i < k; i++) out[a[i] - 1] = i + 1; System.out.println(); System.out.println("result:"); for (int i = 0; i < k; i++) { System.out.print(out[i]); System.out.print(" "); } } }