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

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

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

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

    连续签到: 1 天

    [LV.2]偶尔看看I

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

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

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

    ×
    郁闷 没人来给我加分!' k6 n" o2 j+ m2 E
    假设{1,2,3}表示1,2,3三个数的全排列,那么有下面的结果:
    . j- k6 n: e% i+ p. H( O  {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]的全排列"。
    ! H1 Y. ]; u/ S  令int list={1,2,3},所以:
    ' J# N# E8 K* ]. ?4 b4 T5 _3 ]  perm({1,2,3},0,2)=perm({1,2,3},1,2},perm({2,1,3},1,2},perm({3,2,1},1,3};$ u$ w% f7 x) N7 D5 z  M1 h
    $ X/ v& o7 \  U. P- \3 k

    * S! D/ j6 X. n+ s7 M) x# j  z  理解了这个式子之后就可以写代码了:C源码 #include <stdio.h>/ C+ E- X4 o- [% k7 u8 L; ~
    typedef int ElemType;' U5 ^2 H' ?& N% T5 B

    4 j, `* r, P: Q; `+ K$ o
    void swap(ElemType *a,ElemType *b){# X! N# P" k+ l+ p1 g; U
       
    //交换2个数
    # E2 x# ^9 c- P; T9 g    ElemType temp=*a;+ M0 |6 l# [6 t+ y& {6 `- Z' c
       
    *a=*b;* d+ f& ^6 c; a0 P. l/ m$ r6 l
       
    *b=temp;( t& d3 H# ^+ ?( M  P  F
    }//swap
    * S* {3 b, R+ @# D+ ~0 _* ]% |% ]. R+ ]! Z  \
    void perm(ElemType list[],int begin,int end){- X: l/ N; {1 G1 f3 Z
       
    int i=0;) |) q, F* j$ I0 E
       
    if(begin==end){6 b. f0 F3 N: U8 O. y
            
    for(i=0;i<=begin;i++)4 C7 W9 E( s& o. W0 w
                printf("%d ",list);+ v' f8 i3 c4 t" Q
            printf("\n");1 f- s, T% a9 R: ?# T% w3 ^
        }" y  y8 E/ q7 B  C% M3 ?. Z
       
    else8 S2 n0 G4 ~! f( X. q
    for(i=begin;i<=end;i++){3 O! ]1 o; p; [. t- N
                swap(&list,&list[begin]);
    : o, f  d7 e+ H* l0 L4 ]
                perm(list,begin+1,end);4 w; }+ |4 B0 v- c2 R2 U- ?; J
                swap(&list,&list[begin]);
    + d3 d' a0 ]6 y  a
            }4 T& E7 [7 ]( Q! p9 g- v. N
    }//perm
    5 o% @0 q6 l# |2 s4 Y% H% k& A
    3 o+ {( k" ?! b) }void main(){# s6 |) g7 ~) j4 ~! G
        ElemType list[]={1,2,3};
    ' |7 [9 M3 L4 Z) ]. \; M
        perm(list,0,2);
    , b2 z9 v2 ?% u5 a7 @
    } 8 u$ k, ^+ Z9 m# m" p

    : V, P; p, q& I( I5 b
    - D  _1 G" ~$ ]4 Y3 W3 J
    ! a6 R+ Q& k* ^4 d7 G6 L- b4 y
    C++代码 #include <iostream>7 T8 j; F/ ]& Q5 v5 R; k6 Z
    , J2 d; Y* m- m) ?7 K  e' _: u7 F
    template
    <class _Ty>9 W6 G* l# u7 l
    void perm(_Ty list[],int begin,int end){3 X0 N2 z  c7 P# D, V
       
    //输出前缀为"list[0..begin]"后缀为"list[begin+1..end]的全排列"---这名话很重要;0 ^7 x( b" F$ Q# ?- r* e5 N
       
    //前缀是固定的,求后缀的时候要用递归求
    " i4 }7 x( b% N" i6 S4 {) B% q8 C/ \6 i9 Z) j# ^8 O
    if(begin==end){
    ( i+ U, }9 D% j6 V/ a2 a. c* [        
    //如果相等,则表明前缀为list[0..end],后缀就没有,所以直接输出前缀
    1 Q3 w( P0 `% J7 s9 x$ p- U+ ]" g0 @
    for(int i=0;i<=begin;i++)0 [3 m" S, n6 z& z
                std::cout
    <<list;( k- e% o. _) y  K2 S# h% n
            std::cout
    <<std::endl;//输出一个之后,换行* J' `0 e5 R" ~8 }+ B) i
        }$ ^* c/ v3 K$ h9 E" ^5 a9 O
       
    else{
    7 k3 u. L1 `; u        
    //如果不相等,就要循环(end-begin)次,每次前缀都不同/ u$ ]# J! v: s# }4 k/ v5 d
    5 x/ e: E* E& ~$ Y
    for(int i=begin;i<=end;i++){. f! E1 m+ f7 R- u
                std::swap(list,list[begin]);
    //交换之后就可以得到前缀了8 x* i9 D* V  W
                perm(list,begin+1,end);//递归输出
    ) p- M; U* ~9 n) }            std::swap(list,list[begin]);//换回来
    % l) u8 W9 n4 G* Z7 x- l+ G9 J9 E        }: n* q/ H" G% I% s7 w  M
        }
    $ X$ `5 c& z& B7 L  ?6 Q# d. U( ?- q}, X) x& H; N: a' c6 D
    1 v$ s( D( V4 J( p, c
    void main(){
    6 S( J' |  m) s! b$ L   
    int list[]={1,2,3};
    # T6 x% Q4 }/ ~    perm(list,
    0,2);3 _' Y: w; b2 H, d
    }
    / ?% r" j3 [9 C$ }+ q
    $ z" V9 O$ Z; H- d; ?2 G  @
    0 }3 Q8 j! V% A# T* S
    ContractedBlock.gif ExpandedBlockStart.gif C#源码 using System;& |  T6 D" P8 H" Y0 T  z7 _  z& e2 _
    using System.Collections.Generic;* `/ B8 K' d0 K, D$ }# |
    ! m/ h5 r8 [3 Q8 }) n3 C
    namespace CSharpDemo9 `$ D; _* X6 {" A
    {* o1 k3 I6 V" }
       
    class Program
    4 @. ?5 R  h0 j$ x  s* c    {9 p4 f( i, X. I; S) B  v
            
    public
    - M: z6 A; _( V. ?$ |static
    * h' r4 Z) f( @9 Q' M' m+ c6 bvoid Swap<T>(ref T a, ref T b)" ]6 G5 H( s/ a: c7 g
            {
    ; O. P: I: _2 I3 s. B            T temp
    = a;
    * o! k! g3 ?/ U! P1 C            a
    = b;
    6 ^/ p& I. w# w. |7 u1 P            b
    = a;/ n/ S4 B' b# C% D
            }
    . [; ]5 N- S0 v/ T$ v9 |+ K$ j" ^! X+ }# e% c
            
    public
    ( j7 c/ ?' B& X& B8 G2 ustatic+ q; u& Z  C- @; x# R! c- t7 u$ ]
    void Perm<T>(T[] list, int begin, int end)
    ; n6 g# s- e7 L% A0 A' z# ?        {
    ) ^4 z) r. H9 @7 N7 g7 v) {6 Q            
    if (begin == end)
    " n, A7 D4 E, p, ^9 l            {
    9 g( A/ n" S6 l; @$ H- `! J0 p               
    for (int i =
    $ M2 E# |: e$ v2 F& [7 O+ }% l7 b0; i <= begin; i++)* c/ e. S- |2 G- x
                        Console.Write(list);# R4 Y. h, [+ C" R! U( c* E
                    Console.WriteLine();. F% T5 Z1 ]! _6 b3 G& W, b6 p2 E4 t
                }
    3 M. p" X7 i% v3 n9 D& O- m8 O            
    else2 [1 ?8 i1 P: V1 q& l" m
    for (int i = begin; i <= end; i++)
    $ \' }" t9 y, O) G/ N3 Q" s                {9 U) w  ?# v2 X+ {  d
                        Swap
    <T>(ref list, ref list[begin]);: x. V( s0 E* D; o, s
                        Perm
    <T>(list, begin+1, end);
      D$ `1 g- J- |                    Swap
    <T>(ref list, ref list[begin]);* g0 j! N) x  h- @" R( P
                    }! x! S' t; ^2 m8 C. W! s* J4 G
            }2 }; j) }+ p# X0 n! @& p: s+ M

    ; p4 f1 S2 B8 ^& W6 |4 u4 s- W        
    static
    $ @1 c/ _7 L8 V( ^# Qvoid Main(string[] args)
    ) D- ~5 z6 p7 Q3 n" ?        {
    # a; \1 V6 O: p- a! @/ A$ o            
    int[] list ={ 1, 2, 3 };
    ' {# I# ]7 m8 r& z( P4 m: v            Perm
    <int>(list, 0, 2);
    8 q. Y* x, Y1 b; X1 F  L5 P; J0 E' v8 p        }! P. T" h3 v- _( f
        }
    # Z3 e/ C" W+ C* H: P/ H4 D}7 [. L. X( j$ x4 E* b6 A- D# v: J

    评分

    参与人数 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 08:32

    Powered by Discuz! X3.5 Licensed

    © 2001-2026 Discuz! Team.

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