全排列算法

/* 全排列算法 "后补法" */
void  Permutation2( char *  a,  int  m,  int  n) 

    
int i; 
    
char t; 
    
if (m < n-1
    
{         
        Permutation2(a, m 
+ 1, n);                         
        
for (i = m + 1; i < n; i++
        

            t 
= a[m]; 
            a[m] 
= a[i]; 
            a[i] 
= t;     
            Permutation2(a, m 
+ 1, n); 
            t 
= a[m]; 
            a[m] 
= a[i]; 
            a[i] 
= t; 
        }
 
    }

    
else 
    

        cout 
<< a << endl;
    }
 
}


/* 全排列算法 循环左移 */
void  CircleLeftShit( char *  str,  int  m)
{
    
    
int i;    
    
char temp = str[0];    
    
for (i = 0; i < m - 1; i++)         
    
{
        str[i] 
= str[i+1];        
    }
    
    str[i] 
= temp;    
}


void  Permutation( char *  str, int  m, int  n)
{    
    assert(str 
!= NULL);
    
if (m < n)        
    
{        
        
for (int k = 0; k <= m; k++)            
        
{
            Permutation(str,m 
+ 1,n);        
            CircleLeftShit(str,m);            
        }
        
    }
    
    
else         
    
{        
        cout 
<< str << endl;        
    }
        
}

 


/* 全排列 另外一种算法 
    我们以三个字符abc为例来分析一下求字符串排列的过程。首先我们固定第一个字
符a,求后面两个字符bc的排列。当两个字符bc的排列求好之后,我们把第一个字符a和
后面的b交换,得到bac,接着我们固定第一个字符b,求后面两个字符ac的排列。现在
是把c放到第一位置的时候了。记住前面我们已经把原先的第一个字符a和后面的b做了
交换,为了保证这次c仍然是和原先处在第一位置的a交换,我们在拿c和第一个字符交
换之前,先要把b和a交换回来。在交换b和a之后,再拿c和处在第一位置的a进行交换,得
到cba。我们再次固定第一个字符c,求后面两个字符b、a的排列。
    既然我们已经知道怎么求三个字符的排列,那么固定第一个字符之后求后面两个字符
的排列,就是典型的递归思路了。
*/

/* my implemention */
void  MyPermutation( char   * src,  char   * start)
{
    assert(src 
!= NULL && start != NULL);
    
    
if (0 == *start)
    
{
        cout 
<< src << endl;
    }

    
for (char *= start; *!= 0; p++)
    
{
        
        
char temp = *start;
        
*start = *p;
        
*= temp;
        MyPermutation(src, start 
+ 1);
        temp 
= *start;
        
*start = *p;
        
*= temp;
    }

}

 

 

 

 

 

 

你可能感兴趣的:(c,算法,null,permutation)