zoukankan      html  css  js  c++  java
  • 全排列的问题

    什么是全排列:

    全排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排列数为n!个。现以{1, 2, 3, 4, 5}为例说明如何编写全排列的递归算法。


    算法具体说明,先用示例说明下(比较具体): 

    1、首先看最后两个数4, 5。 它们的全排列为4 5和5 4, 即以4开头的5的全排列和以5开头的4的全排列。由于一个数的全排列就是其本身,从而得到以上结果。
    2、再看后三个数3, 4, 5。它们的全排列为3 4 5、3 5 4、 4 3 5、 4 5 3、 5 3 4、 5 4 3 六组数。即以3开头的和4,5的全排列的组合、以4开头的和3,5的全排列的

         组合和以5开头的和3,4的全排列的组合.从而可以推断,设一组数p = {r1, r2, r3, ... ,rn}, 全排列为perm(p),pn = p - {rn}。因此perm(p) = r1perm(p1), r2perm(p2),

         r3perm(p3), ... , rnperm(pn)。当n = 1时perm(p} = r1。为了更容易理解,将整组数中的所有的数分别与第一个数交换,这样就总是在处理后n-1个数的全排列。


    代码示例:

    #include <stdio.h>  
    
    int n = 0;  
    
    void swap(int *a, int *b) 
    {     
        int m;     
        m = *a;     
        *a = *b;     
        *b = m; 
    }  
    void perm(int list[], int k, int m) 
    {     
        int i;     
        if(k > m)     
        {          
            for(i = 0; i <= m; i++)             
                printf("%d ", list[i]);         
            printf("\n");         
            n++;     
        }     
        else     
        {         
            for(i = k; i <= m; i++)         
            {             
                swap(&list[k], &list[i]);             
                perm(list, k + 1, m);//关键点,处理第一个和后面的全排列,所以每次都需要交换     
                swap(&list[k], &list[i]);//必须换回来      
            }     
        } 
    } 
    int main() 
    {     
        int list[] = {1, 2, 3, 4};     
        perm(list, 0, 3);     
        printf("total:%d\n", n);     
        return 0; 
    } 

    结果是:


  • 相关阅读:
    Java异步消息平台
    spring mvc绑定对象String转Date解决入参不能是Date的问题
    <welcome-file-list>标签的控制作用以及在springmvc中此标签的的配置方式
    第一篇
    Struts2学习笔记《二》
    java的事务处理
    Java Statement和PreparedStatement性能测试(转)
    JAVA上百实例源码网站
    Java程序优化的一些最佳实践(转)
    Struts2学习笔记《一》
  • 原文地址:https://www.cnblogs.com/arbboter/p/4225228.html
Copyright © 2011-2022 走看看