java 全排列 非递归_全排列(递归与非递归实现) | 学步园
1、算法簡述
簡單地說:就是第一個數分別以后面的數進行交換
E.g:E = (a , b , c),則 prem(E)= a.perm(b,c)+ b.perm(a,c)+ c.perm(a,b)
然后a.perm(b,c)= ab.perm(c)+ ac.perm(b)= abc + acb.依次遞歸進行。
void swap(string &pszStr,int k,int m)
{
if(k==m)
return ;
char tmp;
tmp=pszStr[k];
pszStr[k]=pszStr[m];
pszStr[m]=tmp;
}
void Perm( string &pszStr , int begin , int end )
{
if (begin == end)
{
static int s_i = 1;
cout<
}
else
{
for (int i = begin; i <= end; i++) //第i個數分別與它后面的數字交換就能得到新的排列
{
swap(pszStr,begin,i);
Perm(pszStr, begin + 1, end);
swap(pszStr , begin, i);
}
}
}
非遞歸算法
1.算法簡述
Prem( char *s ) //全排列函數
{
char *pEnd = s + strlen(s) - 1;
char *p = pEnd; //p代表替換點
//q代表替換點的下一個數 ,pMax 代表替換點后比替換點大的最小數
char *q = new char,*pMax = new char; //注意初始化!!!
while (p != s) //p == s 就結束循環
{
q = p;
p--;
if (*p < *q)
{
pMax = FindMaxForOne(p,pEnd); //找與替換點交換的點
Swap(p,pMax); //交換
Reverse(q,pEnd); //將替換點后所有數進行反轉
Print(s); //輸出
p = pEnd; //將替換點置最后一個點,開始下一輪循環
}
if (s == p) break; //結束條件
}
}
char* FindMaxForOne(char *p,char *q)
{
char *p1 = p;
char *p2 = q;
while (*p2 <= *p1) p2--;
return p2;
}
總結
以上是生活随笔為你收集整理的java 全排列 非递归_全排列(递归与非递归实现) | 学步园的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手把手带你入门Python爬虫(一、工欲
- 下一篇: c纳秒级计时器_纳秒级性能计时器