想到 前幾天的乙個問題,如何實現元素的全排列 並且按照公升序輸出。
可以有兩種方法:遞迴和非遞迴
首先介紹非遞迴的方法:
思路:以三個數字為例1,2,3公升序的全排列為:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
顯然每個組合 都有乙個直接後繼,找到乙個數沒有後繼如 3 2 1 則停止。
問題來了 那就是如何找到後繼和沒有後繼的數如何判斷該數是否有後繼。就是對於乙個數,如何找到乙個比它大的,且最小的數.
還是1 2 3為例 ,假設 此時的排列為"1 3 2" ,那麼32是非遞增的,而13是遞增的,滿足要求,然後根據要求2是比1大的最小的數,此時交換兩個數的位置得到2 3 1 ,此時 把交換位置後面的數字顛倒反轉即可。得到2 1 3 ,後面的排列都需要這麼做,直到碰到3 2 1即可。
**如下
1:public
class nonrecursivepermutation ;
4:static
int count = 1;
5:
6:// 反轉區間
7:private
static
void reverse(int arr, int pbegin, int pend)
11:
12:private
static
void swap(int arr, int i, int j)
18:
19:private
static
boolean hasnext()
24:return false;
25: }
26:
27:private
static
void next()
37: }
38:
39:"需替換數字置:" + replace);
40:
41:// 從後向前找比替換數大的第乙個數
42:// 比如926540的後繼應該是946520,而不是956240
43:for (int i = len - 1; i > replace; i--)
48: }
49:
50:"替換數字置:" + firstr);
51:
52:// replace與firstr交換
53: swap(arr, replace, firstr);
54:// 替換數後的數全部反轉
55: reverse(arr, replace + 1, len - 1);
56:
57: count++;
58: print();
59: }
60:
61:private
static
void print()
66:
67:/**
68:* @param args
69:*/
70:public
static
void main(string args)
75: system.out.println("陣列完全反轉後的結果:");
76: reverse(arr, 0, arr.length - 1);
77: print();
78: system.out.println("全排列的數目為:" + count);
79:
80:/*********************/
81: system.out.println("陣列是否存在後繼:" + hasnext());
82: system.out.println("陣列一次替換後的結果:");
83: next();
84: }
85:
}
**的核心部分是在next和hasnext函式中。
(下篇文章介紹遞迴的方法)
JavaScript實現元素全排列
n 個不同元素中任意選取 m m n 個元素進行排列,所有排列情況的個數叫做排列數,其值等於 a n n m 表示數學中的階乘運算子,可以通過以下函式實現 function factorial n else if n 0 else console.log factorial 4 24 當 n m 時...
陣列元素全排列(c c 實現)
其實全排列的說白了就是,元素之間兩兩交換,交換後對其他元素進行全排,全排完其他元素,再把原先交換的那兩個元素交換回來。不過這個過程要靠遞迴實現,需要對遞迴的知識有一定的把握。下面附上 本人菜雞,初入部落格,大神多多指教。include bits stdc h using namespace std ...
全排列的實現
在c 的模板中,有一對專門用於實現數字或字元全排列的模板 next permutation biter,biter 和prev permutation biter,biter 前者實現向後排列,後者實現向前排列,即前者在原順序上依次產生較大的排列,後者則相反。舉個例子 假設需要產生以 354 為基礎...