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

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

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

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

    连续签到: 1 天

    [LV.2]偶尔看看I

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

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

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

    ×
    郁闷 没人来给我加分!
    ( F/ T* y" u, g2 s- s1 @3 m9 V假设{1,2,3}表示1,2,3三个数的全排列,那么有下面的结果:
    ! o5 S5 H5 s% Z3 x# d; }% ~: F; N  {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]的全排列"。7 ^1 f! o: c. s% R9 o' Z  C( E
      令int list={1,2,3},所以:9 t3 D' n  ?+ Y, r
      perm({1,2,3},0,2)=perm({1,2,3},1,2},perm({2,1,3},1,2},perm({3,2,1},1,3};
    2 ~% P. O+ o/ |+ `6 F- P- Y
    * P, L0 ?0 y% Q: n. N
    & v9 B) L0 ~6 ^" d. E4 F* O2 i% L( z  理解了这个式子之后就可以写代码了:C源码 #include <stdio.h>9 A) r6 [$ O7 |: I: i# w4 W7 ]8 t
    typedef int ElemType;
    ( i2 x3 a& B: _: }- ?/ A/ R
    * T0 Q# I1 F1 K1 g7 W
    void swap(ElemType *a,ElemType *b){4 Q/ h; A' M# S- _7 u( d5 s3 N. z
       
    //交换2个数* K7 G; Y9 r. A
        ElemType temp=*a;
    : {5 B) d/ J$ z" X, |   
    *a=*b;0 z  V; P, L6 V7 d( @9 b" Y- f
       
    *b=temp;
    . {. E/ e, C9 @5 p2 r
    }//swap+ |0 U$ S1 W! ~( W; H
    # H, s3 N/ @1 Z& c
    void perm(ElemType list[],int begin,int end){
    , S1 O, N: c6 g3 T: e   
    int i=0;/ k4 ~  d) S# [. X- w4 ?
       
    if(begin==end){
    4 `2 H) l5 W6 {6 T( q8 V        
    for(i=0;i<=begin;i++)
    + C/ C4 O6 J/ q. |; r1 V/ y
                printf("%d ",list);, z* S: @8 R- J: j$ Q5 [2 o5 u) U
            printf("\n");
    * u9 B" e# M( U4 z- ?
        }
    ( F+ _" d* [/ O/ s/ @   
    else2 Z' f& K$ x8 L' C4 ]: i$ C- P
    for(i=begin;i<=end;i++){
    0 N( C0 S" _% ]3 o/ O( W
                swap(&list,&list[begin]);" E( |) a0 ?1 G( P+ s3 y
                perm(list,begin+1,end);: u* X, `4 a2 T2 G  _+ O1 K$ X
                swap(&list,&list[begin]);
    # C+ \6 S4 d4 z" r/ M
            }% v# Y3 I0 Q8 o7 `* e$ V6 d9 q% v
    }//perm
    6 f) m! H: A6 \/ E& y* l1 k9 Y3 C6 U. h5 q( A3 X
    void main(){8 h( Q1 |: y% G2 Z" P2 B$ ^% c! c
        ElemType list[]={1,2,3};! k6 m& z/ A2 e1 W8 F
        perm(list,0,2);% q2 L. V* k2 H. _
    } " ?- z$ U# m' P5 ~6 t, h
    7 Y) c: e* b! H- E

    ' _  j$ @: e4 L, K3 W5 C8 j
    ; a* s% E# d5 b' |/ ?6 Y
    C++代码 #include <iostream>& R5 x7 b( x6 c) c
    5 y0 F8 |/ @) j  |, g: o
    template
    <class _Ty>( w$ C/ H! e1 W4 F9 }% K
    void perm(_Ty list[],int begin,int end){
    3 l% D+ W3 k) L! |   
    //输出前缀为"list[0..begin]"后缀为"list[begin+1..end]的全排列"---这名话很重要;
    ( G- l) M5 t; t7 [6 O$ C5 A   
    //前缀是固定的,求后缀的时候要用递归求
    ; V, I" P/ M1 G% A$ b7 m5 \. q' F  h7 \: }
    if(begin==end){. `( |, |- Y) C* T+ Q3 x
            
    //如果相等,则表明前缀为list[0..end],后缀就没有,所以直接输出前缀2 D1 m' Z6 h  [6 F. V

    7 }9 S6 I& T/ I3 c" P, Sfor(int i=0;i<=begin;i++)
    ( Q1 z' s8 r2 i! p# k. Q  t3 Z            std::cout
    <<list;
    / f( o. U& L4 O) L$ I, P        std::cout
    <<std::endl;//输出一个之后,换行; C$ E2 W# w6 t+ w& W8 \% R
        }
    $ A6 w. w8 Q5 f" R2 Z' M2 V   
    else{# q! ]5 a. l1 Z5 M8 G7 q+ C
            
    //如果不相等,就要循环(end-begin)次,每次前缀都不同9 Y' H% w" `( b8 ?8 e9 V. X7 i

    7 L' V! r, A7 q5 X9 r6 j8 hfor(int i=begin;i<=end;i++){
    3 y7 ?  b8 C; ^2 ~3 Y* G) ?! ~            std::swap(list,list[begin]);
    //交换之后就可以得到前缀了
    + w7 ^# w, c9 s$ H% L            perm(list,begin+1,end);//递归输出" X+ g: g8 X/ ]& H( ~
                std::swap(list,list[begin]);//换回来- O8 d# d2 k. d1 Y1 {, u
            }
    2 y3 ~0 O" b. u' F! Y+ H0 f    }5 L  ?: ?3 H' u( G; t
    }
    # f$ f( h0 Y7 v8 Q8 ~$ }* g4 i) J% {
    void main(){) t0 I: B/ ?  Q1 o( |8 k& P
       
    int list[]={1,2,3};
    ; p, B# W9 S) `4 O0 Z) P/ M    perm(list,
    0,2);
    : v  K4 u7 L  X6 c! F. T/ m1 @}
    1 }3 v9 A, ^* _8 Z

      }3 o/ \! v. U) ^: `, v, k" U& F; p# {0 `* a3 x* a
    ContractedBlock.gif ExpandedBlockStart.gif C#源码 using System;% ~! I4 t6 [; H9 S/ a, a
    using System.Collections.Generic;
    . f7 p% S- |' J- r$ e7 O! O0 c  h' \
    namespace CSharpDemo3 R' }" B( [  e" }
    {# g2 _) t  J- p9 H
       
    class Program( o; i% m9 N  h( \
        {
    4 K. ^" N0 F- Q6 s4 z        
    public8 X, d: `# S: R% q7 a  |0 T+ D( z8 ^
    static
    - p8 ^# E; A( R# G/ j8 q- cvoid Swap<T>(ref T a, ref T b)1 A$ ?7 Z# {$ s
            {: ~. o# W1 d, {: t% o
                T temp
    = a;
    * N2 g  r' @# f! c# y            a
    = b;7 B4 n& A$ V3 D: m
                b
    = a;
    2 B7 M& `6 H9 {$ v) r        }9 i1 L0 u1 g& ^) Q6 s) c% S8 ?
    $ g. R" `$ [) s
            
    public
    4 j' ]2 R) ^+ [8 U( s1 b. |static3 ^+ Q3 r7 o1 G! E
    void Perm<T>(T[] list, int begin, int end)( o1 t& J, G6 e/ b6 ^$ K8 m
            {4 \) m8 d9 F) ~) u3 G3 n( q# Z
                
    if (begin == end)
    7 o. V$ t* c( m) `! K' \5 @# K4 Z' ^            {
    - B7 w" ^: i3 H8 e+ }. a8 n               
    for (int i =
    ; b- G/ _4 ~/ t! T; `0; i <= begin; i++)! F3 N8 Z. n  T7 Y! n
                        Console.Write(list);
    * j1 I% R( ^# \                Console.WriteLine();- {" V  D$ F1 E( T! Z7 u0 ]
                }
    0 f8 R% }! P7 M7 ~. G' B/ P            
    else( g% |1 V7 y& y- t" i
    for (int i = begin; i <= end; i++)
    : F2 L1 M. @  M3 w                {1 ]' [8 u7 c( ^4 {
                        Swap
    <T>(ref list, ref list[begin]);5 t/ o: ~+ s$ K- M/ |1 V8 r% z
                        Perm
    <T>(list, begin+1, end);
    ) y# r/ t( O% R: g$ p2 C+ {                    Swap
    <T>(ref list, ref list[begin]);
    ' v1 M: l! ]8 I/ ~                }
    6 f# e# b. m6 ~. a        }/ A" d% r0 Z  E8 W8 Q& ^
    2 U# S: y% {$ s) S6 v
            
    static; i& m6 c6 Z* Y" Z3 [: W
    void Main(string[] args)5 o1 ?% W$ `7 G: B2 j/ I# I
            {* P% Z3 z2 R2 Z* J) M
                
    int[] list ={ 1, 2, 3 };1 V7 C8 P8 n( R8 C8 N) X. b* H
                Perm
    <int>(list, 0, 2);
    0 e. a( A! s; l" y2 P; O        }1 y5 g0 V2 H5 Q) p
        }
    $ |5 g! ]6 V2 j% P* y* i. V9 n}
    9 k( I4 K& u2 O, t% F  m0 R7 f3 O, ~3 P

    评分

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

    查看全部评分

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

    该用户从未签到

    尚未签到

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

    本版积分规则

    招聘斑竹

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

    GMT+8, 2025-4-22 14:11

    Powered by Discuz! X3.5 Licensed

    © 2001-2025 Discuz! Team.

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