设为首页收藏本站|繁體中文 快速切换版块

 找回密码
 立即加入
搜索
查看: 926|回复: 1

C\C++\C#实现求全排列

[复制链接]
  • TA的每日心情
    慵懒
    2016-4-21 12:07
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    累计签到:3 天
    连续签到:1 天
    发表于 2010-5-4 10:16:03 | 显示全部楼层 |阅读模式

    马上加入,结交更多好友,共享更多资料,让你轻松玩转电力研学社区!

    您需要 登录 才可以下载或查看,没有账号?立即加入

    ×
    郁闷 没人来给我加分!! v+ ?4 ^6 x2 {% U9 \$ n
    假设{1,2,3}表示1,2,3三个数的全排列,那么有下面的结果:3 t' Z+ W2 S# d* S" ?$ ~
      {1,2,3}=1{2,3},2{1,3},3{1,2} 也就是说求1,2,3有全排列由三个部分组成了分别为1{2,3},2{1,3},3{1,2},大括号前面的称为前缀。一直递归下去就可求出结果。所以假设perm(int list[],int begin,int end)表示输出前缀为"list[0,begin]"后缀为"list[begin+1,end]的全排列"。
    9 ^  n6 ^/ D# @1 q  令int list={1,2,3},所以:
    $ q7 j; l) D3 k+ w' h) c- o5 K: Y  perm({1,2,3},0,2)=perm({1,2,3},1,2},perm({2,1,3},1,2},perm({3,2,1},1,3};
    ! j# I: \0 t8 [" a* l, a% ?# {- p) A, |4 W

    + B! Q: N9 ^# _7 D% ~& g4 m; R  理解了这个式子之后就可以写代码了:C源码 #include <stdio.h>8 i5 B5 D" ^0 ^! m) u/ y$ F
    typedef int ElemType;
    + J  C2 p5 B" V7 K2 D/ |# ]7 C4 o- d% @+ l
    void swap(ElemType *a,ElemType *b){
    7 f' ~* i) y9 K   
    //交换2个数
    ( u/ C8 _/ P+ h4 g/ Q, i    ElemType temp=*a;8 e8 ~8 D; [1 Z+ ?7 h. L# g& g
       
    *a=*b;
    8 \$ J9 z$ y7 F: z# a3 ~; I6 Z& f   
    *b=temp;
    0 M# G/ L7 w) O: i& [1 f
    }//swap
    + V& x( j; V5 t3 T8 l5 a2 {% E" G, f) ^5 q) b; U6 z( D
    void perm(ElemType list[],int begin,int end){8 ?. V5 {8 Z! {* S6 k
       
    int i=0;. A" l& e/ v7 L8 V% W
       
    if(begin==end){
    3 h' L& K) R; J# L        
    for(i=0;i<=begin;i++)
    4 M+ ?1 z/ E9 \2 M* x' r
                printf("%d ",list);
    ( f+ Z. c! r8 W, S
            printf("\n");
    5 W: q5 _5 v* o
        }
    $ _  w7 O/ u. J0 x  g& @0 [   
    else( m7 B+ p* \. [3 r# F
    for(i=begin;i<=end;i++){9 y9 |+ y* ?8 o+ x
                swap(&list,&list[begin]);
    0 B9 i, Y8 o; t0 b
                perm(list,begin+1,end);
    % F) Q* |0 L% f* \2 I) p
                swap(&list,&list[begin]);* \' y- v# B  a% [8 B- w
            }
    4 x" v' w6 H- S: I( d  V
    }//perm
    3 ]8 h5 o" i6 Y8 @$ O- H6 r
    4 ^' r6 J- z! p  p2 @/ k( p: qvoid main(){" O8 G" N! n9 ?3 o. ~2 y
        ElemType list[]={1,2,3};" f" J& X7 F5 L* V! O
        perm(list,0,2);
    2 _2 n) ?8 L7 d9 ^4 T& _
    }
    ; D& N$ G, E9 k$ W4 ^* P

    $ U) P( z: |! a2 X4 l+ [" R# z! D. P# r" n; n

    # `$ x5 w! i7 ~# k
    C++代码 #include <iostream>
    , i, o# K. |, s4 b0 V4 r8 t* P3 G! a: h' ~8 L5 J# m
    template
    <class _Ty>
    . O/ V7 ]1 B7 b: qvoid perm(_Ty list[],int begin,int end){5 o" A. u) c6 ^. v) h2 G
       
    //输出前缀为"list[0..begin]"后缀为"list[begin+1..end]的全排列"---这名话很重要;7 S0 Q: O, g1 H" q/ k
       
    //前缀是固定的,求后缀的时候要用递归求/ \3 w4 D4 R& J  Z. b  D7 U

    ! Q) h5 e" }; F5 dif(begin==end){
    ' x% g4 c0 `6 X2 R8 \        
    //如果相等,则表明前缀为list[0..end],后缀就没有,所以直接输出前缀& `$ U0 d) a6 E" I; |
    . o. f: V2 w  f' c! v
    for(int i=0;i<=begin;i++)
    9 \- ~. x. m7 v6 X6 t# o' m# h            std::cout
    <<list;
    4 O+ P( k& A4 b- R- V+ S        std::cout
    <<std::endl;//输出一个之后,换行
    # v4 e  a2 M$ O( @  y# `. L    }
    " v$ s# K$ ~. g- W6 C4 P- ?, M" H   
    else{" P, b2 g  L! l
            
    //如果不相等,就要循环(end-begin)次,每次前缀都不同9 U/ v% G4 R2 F! Y7 l
    ! ?1 m8 F3 y+ C% m
    for(int i=begin;i<=end;i++){
    # X3 @- C- W; _3 O1 J" H! Q            std::swap(list,list[begin]);
    //交换之后就可以得到前缀了  h0 j3 z0 V& g
                perm(list,begin+1,end);//递归输出$ G: u* J1 I$ O" i' N. y
                std::swap(list,list[begin]);//换回来9 ^3 z3 o6 R0 ?0 t
            }) b7 o) J. d, Q. o+ m
        }
    * N. N5 H+ V! D( T}
    % D+ q, C# c# g/ V; t7 y& f2 X( C
    * U4 T2 @2 I- A, b1 y
    void main(){4 A8 R0 P4 x5 L+ Z4 }4 e8 t' s& e
       
    int list[]={1,2,3};
    : S7 V% d" {8 X/ m/ b    perm(list,
    0,2);
    $ c- Z8 X' c/ [# q+ s! E( a* A9 K+ x}
    . t- K- v) ^3 L7 D5 ]
    0 m* c" F# \7 p" W) b

    ! J$ C1 P* z, p8 ?: G! Z ContractedBlock.gif ExpandedBlockStart.gif C#源码 using System;
    : W1 T4 f+ G& j' H
    using System.Collections.Generic;* `$ ~# h2 z, h( `3 z( ]$ b2 M; y
    & j+ d% a/ B' d1 M2 A
    namespace CSharpDemo! @$ K, f" z4 y) ?% c  e( t
    {8 b3 V. Y- `) @% E4 u
       
    class Program# Q5 C9 c0 [, K3 c1 b/ c0 Y  M
        {! x% N7 p, r! T
            
    public
    % q, x* }7 F- \$ \static- |+ a" y, G, z5 L& S3 H
    void Swap<T>(ref T a, ref T b)
    0 d9 v1 j# R( A# k        {
    + y0 R) [: G4 I8 M5 C6 b            T temp
    = a;
    6 Y; G& L/ U/ k/ m            a
    = b;+ E) S$ F- V/ D$ L: [& @
                b
    = a;; l; F9 |! N2 E& e4 b9 R
            }) C* _6 V: q8 X3 ]4 _" E# r
    ' f, ~' B! ~, ~- i" X" a
            
    public8 {: [( v. k2 I! ^; X4 A
    static4 v$ T( r/ E* \1 O3 x; h# n+ ~
    void Perm<T>(T[] list, int begin, int end)) ]8 Y- z1 D; v6 c, L2 `( d
            {
    ( r) Y# q! E7 ?+ d' d            
    if (begin == end)
    + B7 E2 X4 M4 H. O- A5 b            {
    . j# f, Q2 v: W' r               
    for (int i =
    : a  ?( J% ^% f: h. b- y0; i <= begin; i++)2 E0 g  r1 }& q( \* M
                        Console.Write(list);
      c; g. `$ y4 ]                Console.WriteLine();, o9 z0 G! @. o7 h
                }( n; {# L+ Q1 W5 a' M5 ]# c/ v: i
                
    else
    " V+ S9 h. a% s" l/ gfor (int i = begin; i <= end; i++)
    & T, h% `- I6 @1 z+ f                {& c4 M/ a7 {7 u
                        Swap
    <T>(ref list, ref list[begin]);9 q7 q4 Z# _: g4 L9 h
                        Perm
    <T>(list, begin+1, end);
    5 f- I7 ~( E& p: }  e                    Swap
    <T>(ref list, ref list[begin]);
    5 K( _% p  M5 P+ g9 _                }
    1 ]4 z6 d& p8 T- F' H' i        }/ ?, T4 u+ ]+ A' M* s/ \

    2 h7 f6 r- e& {4 c        
    static1 ~" f/ @9 {$ @7 T/ R& L1 a3 Q
    void Main(string[] args)* |- s2 r* C$ l
            {
    , ^8 b2 ^, W2 R0 S6 T            
    int[] list ={ 1, 2, 3 };
    " I! X2 T4 ~( Z/ V' z8 V1 p            Perm
    <int>(list, 0, 2);
    / `/ N+ K% R) \0 r& K( _        }, O" d2 b1 l* [- o& S, n7 I
        }( D, n, J0 @- W6 G% U$ t
    }& s! \8 E8 ^% Z! E

    评分

    参与人数 1威望 +1 学分 +1 收起 理由
    zxygedi + 1 + 1 谢谢分享

    查看全部评分

    "真诚赞赏,手留余香"
    还没有人打赏,支持一下
    楼主热帖
    帖文化:【文明发帖 和谐互动】 社区精神:【创新、交流、互助、共享】

    该用户从未签到

    尚未签到

    发表于 2011-4-13 09:20:19 | 显示全部楼层
    来学习~ 准备用matlab编~
    "真诚赞赏,手留余香"
    还没有人打赏,支持一下
    帖文化:【文明发帖 和谐互动】 社区精神:【创新、交流、互助、共享】
    您需要登录后才可以回帖 登录 | 立即加入

    本版积分规则

    招聘斑竹

    小黑屋|手机版|APP下载(beta)|Archiver|电力研学网 ( 赣ICP备12000811号-1|赣公网安备36040302000210号 )|网站地图

    GMT+8, 2025-2-24 16:41

    Powered by Discuz! X3.5 Licensed

    © 2001-2025 Discuz! Team.

    快速回复 返回顶部 返回列表