• 全排列算法原理和实现


    本文为原创,如需转载,请注明作者和出处,谢谢!

        全排列是将一组数按一定顺序进行排列,如果这组数有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;     
        
    *= *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[] = {12345};     
        perm(list, 
    04);     
        printf(
    "total:%d\n", n);     
        
    return 0

    谁有更高效的递归和非递归算法,请回贴。

  • 相关阅读:
    linux shell 脚本30分钟教程
    ubuntu nginx+mysql+php 服务器环境自动配置脚本
    前端开发中常用工具函数总结
    经常逛的技术网站
    简单好用的在线思维导图工具
    在线短信接收
    一些图片站
    常用CSS媒体查询
    Dart Language samples
    IDEA 快捷键
  • 原文地址:https://www.cnblogs.com/nokiaguy/p/1191914.html
Copyright © 2020-2023  润新知