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

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

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

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

    连续签到: 1 天

    [LV.2]偶尔看看I

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

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

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

    ×
    郁闷 没人来给我加分!
    , ]: P3 B- o* [6 J3 \1 }) ^假设{1,2,3}表示1,2,3三个数的全排列,那么有下面的结果:3 f  D" q- j* v. v
      {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]的全排列"。
    5 \  ?: d/ k8 Y, |( G8 \$ N+ g  令int list={1,2,3},所以:
    / Q/ p- c8 H5 s8 b! d- X/ j4 k  perm({1,2,3},0,2)=perm({1,2,3},1,2},perm({2,1,3},1,2},perm({3,2,1},1,3};
    - k, f0 ?/ R7 S; x1 ^
    ' K6 Q7 Z% G. l; K& S
    ; r, }2 \3 R" R/ r. J* p* S" ?  理解了这个式子之后就可以写代码了:C源码 #include <stdio.h>7 g& Z/ A7 [. _! B7 S) O
    typedef int ElemType;2 F- ~( T2 F+ i( A! |% `+ b

    3 C% B* z3 }4 J& k+ P2 {
    void swap(ElemType *a,ElemType *b){( y6 u, ?( M8 ~' ~# [' O( l  u+ y
       
    //交换2个数
    * r2 f% Y% A6 u9 j6 t) g    ElemType temp=*a;8 j% t* L  D2 l+ s5 F% [
       
    *a=*b;
    & ^4 ^. i9 V' f4 o1 t2 `' ]( F- z   
    *b=temp;
    ; u3 ^4 b+ m* W! M* R& d
    }//swap6 |# w: Y, X: Z1 _

    6 O0 X6 g$ h2 P- }void perm(ElemType list[],int begin,int end){9 ^# Q3 V6 v9 O( w" m& T, e
       
    int i=0;
    6 ?! V) R0 s) V   
    if(begin==end){  m$ U3 ~9 d# R
            
    for(i=0;i<=begin;i++)
    4 V3 H7 N+ P" r( Z
                printf("%d ",list);- I& m% J4 c* ^1 j
            printf("\n");. I" a6 b% }  o8 v
        }7 T1 d! S* l4 r1 \1 b' h
       
    else! c: Z7 h5 p" {
    for(i=begin;i<=end;i++){  Y9 a! r- {; u+ y" Q: Q% y* R2 R/ ?
                swap(&list,&list[begin]);: X9 S" Z) w$ H' S1 B4 ?  y
                perm(list,begin+1,end);' @1 ]$ e& Z& _' ~( J/ H) r
                swap(&list,&list[begin]);
    2 u5 m: X) ~$ ?% W4 {
            }! S" Z, y3 r# d: ^; _
    }//perm
    7 L# R8 h( }* C3 W. v; \
    9 k1 H' a( D! |8 nvoid main(){- y+ H- n1 W5 q3 k4 \; ^
        ElemType list[]={1,2,3};& t; Z3 f1 H2 {# @; \  F: W( b) }
        perm(list,0,2);
    * f; j4 F2 o, X+ n4 I; a
    }
      |+ v8 z9 c$ m7 n
    * u" O6 V- u/ s

    , r4 g$ v' M+ z! I8 i! m
    7 X1 x3 H$ I' R; _9 i
    C++代码 #include <iostream>+ ~$ o& J+ Z& b1 F& w; m

    ; l# H9 h: s  Ftemplate
    <class _Ty>
    % \  w- e1 i* }/ c9 Mvoid perm(_Ty list[],int begin,int end){
    . K, N$ r0 e  E" ]% t* ]   
    //输出前缀为"list[0..begin]"后缀为"list[begin+1..end]的全排列"---这名话很重要;! _9 w" l$ c- U& W
       
    //前缀是固定的,求后缀的时候要用递归求* d- I# L! P6 K' i2 m  x: M
    - O1 y5 ^6 A* V- }/ R7 i
    if(begin==end){3 ~% E. d) b. }/ |
            
    //如果相等,则表明前缀为list[0..end],后缀就没有,所以直接输出前缀
    ) p, G  f2 p  N, O3 W, T1 ^! _% ~$ @
    1 ]; R! u4 P. K- y, Ifor(int i=0;i<=begin;i++)
    % J0 u9 \4 h' C, ^3 x- c2 k            std::cout
    <<list;
    3 l6 M5 V: R0 A% C        std::cout
    <<std::endl;//输出一个之后,换行* i: Q4 B" u$ `, h) R3 k- F
        }
      d1 T3 ^/ Z5 q9 L5 Z   
    else{, Q8 R& H9 N: a; `: m  N) V: F
            
    //如果不相等,就要循环(end-begin)次,每次前缀都不同; n# _9 l% t% H. s9 x# L
    0 O! V7 b! j$ \! X2 g) {; C! T2 {
    for(int i=begin;i<=end;i++){
    9 T) D# f% n, ]% g; B            std::swap(list,list[begin]);
    //交换之后就可以得到前缀了9 K6 S, h& \. B" n1 Z: }4 {
                perm(list,begin+1,end);//递归输出
    1 k1 l$ B- T( l7 O            std::swap(list,list[begin]);//换回来6 v9 h8 M, }( r7 d3 _
            }6 A0 ]4 |' K& m5 a' v
        }. @- g5 q; ], N
    }
    ' }. l: P; y" Y+ i" p: ?, {% v1 y- V
    + z. k. n6 T) t+ {" d7 K1 ~% g& s
    void main(){
    $ A' f6 ~8 y! `0 b3 D' _# f- M   
    int list[]={1,2,3};  _( v5 ^+ {* T8 u. P) a
        perm(list,
    0,2);
      t  m& m6 h9 W1 `; K}

    1 }/ ]' k, d# w* ~& d! Q
    " {6 t$ P# }6 @2 Z; [/ S  F+ Q+ H+ o  J6 C9 y  R( N# g
    ContractedBlock.gif ExpandedBlockStart.gif C#源码 using System;+ I7 h. C9 z* b! ]4 r/ d
    using System.Collections.Generic;
    ! K1 |  x$ ^  Q, p2 `
    ' o: P0 v8 U. ]3 @9 K7 V# e
    namespace CSharpDemo0 m; m* |  E9 |/ p9 H3 e8 ~% l
    {
    + r+ s3 x& P' s* Q/ X+ q4 x   
    class Program) I, M* c; s- w* @$ ^% [7 v/ y
        {
    ' j( |( y1 U# @4 {6 @        
    public
    2 y% [5 R5 Y; ~% i( S, cstatic- v4 L' S* O. r6 n# E6 E8 Y
    void Swap<T>(ref T a, ref T b)4 B2 x& M9 ]2 T
            {
    8 `8 V' U3 y" M( A" ]; B3 ]; |            T temp
    = a;
    4 \0 v, @6 }+ a+ _            a
    = b;5 h# c  W* J6 e5 M& \  Z
                b
    = a;
    . }$ k8 X1 W- b* r        }
    * s- m8 P2 C2 N5 ^2 i2 F
    * M% F% X( P! _, T8 X* ]        
    public) V$ ]4 Y6 W$ ]: a
    static# t8 k* Y0 B/ v" I  z: n
    void Perm<T>(T[] list, int begin, int end)
    6 J; Q' ~- ^9 O        {2 \' z% q+ v5 n
                
    if (begin == end)/ D5 [; h: I( R$ W3 ?5 `
                {
    , Z. X: ~/ `! ?% d! _               
    for (int i =0 R. C7 K/ P! a  Z8 c( Y( A, a
    0; i <= begin; i++)2 z4 Q) v5 F& d' `
                        Console.Write(list);3 R; Z8 e8 D( \0 M
                    Console.WriteLine();- k7 _! l" u: {9 O
                }
    # O" o) i" G( L1 I, Z, \; f7 @7 c$ z            
    else8 J& {  Y- A9 Z/ z- m2 O
    for (int i = begin; i <= end; i++)) y: {) w* |. y# o) V/ G& |" T/ ]6 D2 X
                    {
    2 A" j% Q) r% d                    Swap
    <T>(ref list, ref list[begin]);+ K' B( S1 t0 z% N
                        Perm
    <T>(list, begin+1, end);
    ( d; N5 [4 p0 b( Y' W                    Swap
    <T>(ref list, ref list[begin]);
    & m) a. m+ L6 T. c                }
    * J5 s* {; g& Y6 k6 F, u6 f  B        }
    7 P+ h1 R1 W# I- }  n3 f9 f4 M" w. B0 M9 S+ B& t+ D
            
    static1 d! S$ l; E5 x" [9 I; ^" d) ^
    void Main(string[] args)1 U- P1 _8 I$ @
            {
    - K! ]; L0 U8 B# w4 l: v* Q            
    int[] list ={ 1, 2, 3 };; F/ c8 o( {* |8 U  U1 @
                Perm
    <int>(list, 0, 2);8 c8 J: v7 W4 M2 Y
            }
    3 F* v, u8 J8 t3 }# H    }+ V- _- Z9 u8 N, G( u: S5 ?
    }, O: j7 R* R9 M2 f  w+ w7 l

    评分

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

    查看全部评分

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

    该用户从未签到

    尚未签到

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

    本版积分规则

    招聘斑竹

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

    GMT+8, 2026-10-10 11:30

    Powered by Discuz! X3.5 Licensed

    © 2001-2026 Discuz! Team.

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