思想:对于数列,设其全排列用集合表示。其全排列集合可以用一种递归方式定义:



其中,表示以开头的所有全排列集合。

 

程序实现可以用递归实现,代码如下:

void print_it(int arr[], int n);
void arrange_all(int arr[], int size, int pos);
void swap(int& a, int&b);

int main()
{
    int a[4] = {1234}; 
    arrange_all(a, 40); 
    return 0
}
/*
 函数名: void arrange_all( int  arr[], int  size,  int  pos)    
 描述:    打印所有排列  
 参数:    arr[]  排列存放的数组
        size   要排列的数据个数           
        pos    当前排列位置  
*/
void arrange_all( int arr[], int size, int pos) 
{

    int i, tmp; 
    if (pos + 1== size) //如果已经排到最后
    {
        print_it(arr,size); // 打印数组
        return
    }
    for (i = pos; i < size; i++) //对当前位置后的所有位置排列
    {
        swap(arr[pos],arr[i]);// 交换
        arrange_all(arr, size, pos + 1); //递归,继续后面的调用
        swap(arr[pos],arr[i]);// 再交换回来,保持原有的排列次序

    }
}
/*
 函数名: print_it(int arr[], int n)   
 描述:    打印数组
 参数:    arr[]  需要打印的数组
        n   数组的长度 
*/
void print_it(int arr[], int n) 
{
    int  i;
    static int cnt = 0
    printf("%04d: ", ++cnt); 
    for (i = 0; i < n; i++) 
        printf("%2d ", arr[i]); 
    printf(" \n"); 
}
/*
 函数名: swap(int &a,int&b)   
 描述:    交换
*/
void swap(int &a,int&b)
{
    int tmp = a;
    a=b;
    b=tmp;
}

 

posted on 2012-09-30 14:42  子桥  阅读(762)  评论(0编辑  收藏  举报