打印1,2,3,..,n的全排列

[面试常见题系列] 打印1,2,3,..,n的全排列

思路:递归算法
前0..cur-1位置上已经排好,当前cur位置取一个和前面都不一样的,然后递归处理后面的。

/* 输出1,2,3,..,n的排列数 */

#include 
<stdio.h>
#include 
<assert.h>
#include 
<malloc.h>

void p(int n)
{
    
extern void _p(int n, int cur, int *a);
    
int *a;
    a 
= (int *) malloc(n * sizeof(int));
    assert(a 
!= NULL);
    _p(n, 
0, a);
    free(a);
}

void _p(int n, int cur, int *a)
{
    
int i,j;
    
if (cur == n)
    {
        
for (j=0; j<cur; j++)
        {
            printf(
"%d ", a[j]);
        }
        printf(
"\n");
        
return;
    }
    
for (i=1; i<=n; i++)
    {
        
for (j=0; j<cur; j++)
        {
            
if (a[j] == i)
            {
                
break;
            }
        }
        
if (j>=cur)
        {
            a[cur] 
= i;
            _p(n, cur
+1, a);
        }
    }
}

int main()
{
    p(
3);
}

posted on 2009-03-19 12:37  庄冠华  阅读(627)  评论(2编辑  收藏  举报

导航