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

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

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

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

    连续签到: 1 天

    [LV.2]偶尔看看I

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

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

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

    ×
    郁闷 没人来给我加分!
    4 E8 x7 f  l8 A) P1 u+ W9 A; f6 u假设{1,2,3}表示1,2,3三个数的全排列,那么有下面的结果:
    , |  J% B* W3 [3 i! E/ e4 `  {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]的全排列"。
    " e7 B. {, m2 Q2 Z# X  u% k; \6 W  令int list={1,2,3},所以:7 l* z  s: R7 `) b1 c( @- G
      perm({1,2,3},0,2)=perm({1,2,3},1,2},perm({2,1,3},1,2},perm({3,2,1},1,3};) ^* o1 p, ?7 R3 ?2 ]

      ?$ U2 Y7 C, w6 G# K  l
    : h6 A) e* y6 H- ?! t  理解了这个式子之后就可以写代码了:C源码 #include <stdio.h>
    $ q* r6 n& G5 X4 Q! c2 ltypedef int ElemType;
    / Y& w( O; y3 s; t- ]
    ; T& Q! q* @& A, }# V9 a2 l! y
    void swap(ElemType *a,ElemType *b){
    1 S% i+ H( ^) j0 q   
    //交换2个数+ r8 L  q# R* K  r* S5 o
        ElemType temp=*a;2 j, w3 E% y9 a
       
    *a=*b;
    - L% Q+ w# m9 p" c* b; |. [   
    *b=temp;3 R+ b, w7 h) B% E- h
    }//swap8 g5 Q& ]: P, D$ @5 p
    8 C: V( w8 Q  G3 C% O
    void perm(ElemType list[],int begin,int end){: d7 Q  v4 y9 L3 D1 e( t
       
    int i=0;$ p; K' i$ ^7 g0 X4 ~2 A$ L/ F
       
    if(begin==end){+ f$ `$ V# K, ?
            
    for(i=0;i<=begin;i++)
    + `: S# b4 k/ C
                printf("%d ",list);/ ]$ c, F4 T) _
            printf("\n");0 e! W+ g% p" {1 o
        }6 N% h# y1 o/ G8 i+ |* S/ Q
       
    else
    0 K# h4 }$ l/ o. B- i4 q6 D) u, {for(i=begin;i<=end;i++){
    / n8 b/ C4 g# Q5 \
                swap(&list,&list[begin]);
    ) x% L5 @7 v- ]9 a  q( \
                perm(list,begin+1,end);" S9 \/ N1 B9 P* M! R
                swap(&list,&list[begin]);! D' V" X8 {+ |3 q7 f" f
            }
    2 {  O1 |) @: T$ e# ~
    }//perm
    # T2 O( \% ^3 A8 F
    8 M' G$ N1 @" Wvoid main(){! x9 y$ H0 t' V; a. N4 u" A6 d8 I
        ElemType list[]={1,2,3};1 C  X% a5 ?. j3 \
        perm(list,0,2);
    + y6 _4 F/ ?5 `! _9 N9 m5 j  q
    }
    : Y6 @: L4 r0 F8 l* i: ?
    0 t0 Y8 J) ?$ \" \9 u

    2 a# C) W2 D1 W; f/ K- I
    3 \  E6 w6 t: ], _
    C++代码 #include <iostream>1 Z8 p0 q) Q4 z' i
    ; _9 X: n" ]& o: V# r
    template
    <class _Ty>9 F; `: t0 L7 n; D) i$ _, _
    void perm(_Ty list[],int begin,int end){' F  I6 j* ]2 |4 D
       
    //输出前缀为"list[0..begin]"后缀为"list[begin+1..end]的全排列"---这名话很重要;
    / `! O. F, }+ m' Z$ M/ }+ E5 o   
    //前缀是固定的,求后缀的时候要用递归求4 h6 L/ p! X8 l; t0 w8 l
    ' b1 z; p& p: N1 S9 u) e" {
    if(begin==end){
    # \) G, j; e; k6 ?        
    //如果相等,则表明前缀为list[0..end],后缀就没有,所以直接输出前缀
    ; X( o0 n1 H: P* ~, n! V0 d. |8 S) s5 M/ Z+ ]
    for(int i=0;i<=begin;i++)5 g/ v' G: R" W' G/ c; n' x
                std::cout
    <<list;0 [8 l, t- e( d1 l8 ]  F# }
            std::cout
    <<std::endl;//输出一个之后,换行
    ) _( D, C! E7 b" h; X  s, ]+ Y2 r0 q    }* L* I+ L+ D* ?1 Y5 M! O
       
    else{
    8 }+ u/ ~" c* S  ^        
    //如果不相等,就要循环(end-begin)次,每次前缀都不同
    2 p  A) R1 l5 }- b/ R/ J# G  @; W- ~0 I) F6 [/ j; w
    for(int i=begin;i<=end;i++){
    ; _# E9 b8 ^+ r6 @' D6 p) p            std::swap(list,list[begin]);
    //交换之后就可以得到前缀了
    # a- n- F/ b: r4 w  X9 ~& d- d            perm(list,begin+1,end);//递归输出$ }2 c/ r5 D& G# L9 X! Q& I! _0 S
                std::swap(list,list[begin]);//换回来
    ; O6 f. a. w( V# w$ n# e        }& c8 ~9 o4 f5 g) R$ b2 }
        }
    2 m* Z2 j! D# @! E: W8 z' U}
    1 m8 x2 v7 N" a" f* [
    9 l  E( D) |2 u" G. a
    void main(){
    ; p% M9 i6 I. S' o% C- n   
    int list[]={1,2,3};, E' e; a% `& W: z/ P  V$ K
        perm(list,
    0,2);
    . F! C1 V: @9 `}
    4 D/ e! P( n2 }4 e/ [
    - n- N& d3 h1 K
    0 P$ X$ A/ O  C# L' @! e0 D( x
    ContractedBlock.gif ExpandedBlockStart.gif C#源码 using System;
    / _5 {- t7 [3 g, z4 R
    using System.Collections.Generic;
    ' {; r9 n- K: q
    & {* o2 x# t4 [7 u% q
    namespace CSharpDemo
    1 q7 c; z" A/ D. l+ J{
    " s6 m6 |* q2 b2 d7 K   
    class Program7 |. S# f& P7 F# H
        {
    , l/ g- o* d4 k+ X        
    public
    $ @2 G, j' L$ M$ b1 Nstatic
    ( e: B0 o/ L  X2 c" t6 b3 I' q6 ]2 pvoid Swap<T>(ref T a, ref T b)
    0 n# g0 z2 X; J/ ~+ b$ V* L: ?- z        {
    5 u  \0 K% p! d1 ?, G            T temp
    = a;
    % E8 f4 H+ b. y+ L: _            a
    = b;
    ) _+ k6 @  q" q6 [5 G4 q$ t/ c            b
    = a;$ j7 O. m1 N- X6 w" ^1 [
            }0 M: F  h' _; ?) i

    6 L+ b  Y, l* B7 e        
    public
    - P8 W$ B0 q% u3 S( O7 G2 b, Xstatic
    $ w5 U5 Q4 ~! `$ m& _void Perm<T>(T[] list, int begin, int end)
    & O, B& N6 u' f2 Q& W        {( q! o; z" K. E& I4 W
                
    if (begin == end)
    3 K) `! x4 V* a. `# M; [! T+ F/ B            {3 |) J0 X! Z9 e7 |3 m1 s
                   
    for (int i =: F( S2 \6 U0 x  j: F
    0; i <= begin; i++)
    ! z, W. T! a6 v' m* O7 e                    Console.Write(list);- w% h) w# k; N' n
                    Console.WriteLine();
      Y  s& e; y' w! H            }! C: k" l  b1 z% g. U0 D
                
    else
    8 K5 F# t8 G: H- H3 Mfor (int i = begin; i <= end; i++)
    ) N- h# p; `* k5 R: [" ]                {
    , X  v' X1 I/ ]& _6 T, d2 K2 s                    Swap
    <T>(ref list, ref list[begin]);
    2 f. F3 e6 r5 o0 B) U                    Perm
    <T>(list, begin+1, end);2 q: `3 T. a% a; A+ J8 ]
                        Swap
    <T>(ref list, ref list[begin]);0 H& t8 s+ \$ h" Y
                    }
    ( S7 b, b; g7 A# j' n% C1 l        }
    0 u; J8 w7 a; W$ ?0 |: v' S. q3 \8 g. m) U% c
            
    static
    1 \6 z) O/ t6 ?9 Ivoid Main(string[] args)
    ( r! V. m2 T7 y: G9 s        {
    ( c4 U$ P1 i$ K( T# m  N- ~2 d            
    int[] list ={ 1, 2, 3 };
    + I7 p) c4 D& c' i9 f            Perm
    <int>(list, 0, 2);& ~8 |. X$ X! q" R, Q0 k
            }8 @5 J/ N! c/ b( E& n$ X
        }* k) U7 E- C9 c+ v" m
    }
    3 B/ M( h2 ?. L/ U) q) Y/ ^! u

    评分

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

    查看全部评分

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

    该用户从未签到

    尚未签到

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

    本版积分规则

    招聘斑竹

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

    GMT+8, 2026-10-31 20:20

    Powered by Discuz! X3.5 Licensed

    © 2001-2026 Discuz! Team.

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