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

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

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

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

    连续签到: 1 天

    [LV.2]偶尔看看I

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

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

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

    ×
    郁闷 没人来给我加分!
    ! R* Q9 n  }* B6 M6 `- e* h假设{1,2,3}表示1,2,3三个数的全排列,那么有下面的结果:/ I9 |  F' P. l' Q# S7 X) p+ d- [% H
      {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]的全排列"。3 T0 S) s$ ?9 z5 Z" p5 G
      令int list={1,2,3},所以:
    * @! Y- @& X4 R) u" a6 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};+ M4 l8 M! @# w; u4 a
    ; _7 s8 M; e" }4 c, H4 X( x
    ' V' `/ l/ ?7 |' C6 r" E7 s* y8 L
      理解了这个式子之后就可以写代码了:C源码 #include <stdio.h>
    : \+ Q% A5 }1 {6 t9 X* vtypedef int ElemType;
    1 w0 q3 |* j. r
    , e4 k9 c. _4 c
    void swap(ElemType *a,ElemType *b){
    ( A6 [/ @, w* m6 Q  Y. _+ B   
    //交换2个数
    7 H- @- y1 l# @. M    ElemType temp=*a;. T2 N, _9 U- o/ [$ N
       
    *a=*b;6 c- U# E% D4 n# U$ m/ C9 t
       
    *b=temp;$ I$ U7 b# G- f2 Z
    }//swap
    - R( [0 [5 c( {1 x4 o3 ~
    6 O7 W0 I9 S) ]( g: W* Fvoid perm(ElemType list[],int begin,int end){6 s% Q9 d6 N# j; P
       
    int i=0;5 h6 |% A! T9 I$ n. F6 Q
       
    if(begin==end){7 v' P9 _8 K* c
            
    for(i=0;i<=begin;i++)5 t% @: u- C3 ?# _2 g
                printf("%d ",list);
    7 U% J* T2 l1 j2 P3 E( H
            printf("\n");
    . I2 D7 E0 D( T. B. Q* o- O
        }
    9 a, E/ m, a0 `) J   
    else* E9 ]1 J' F+ L
    for(i=begin;i<=end;i++){2 K8 q  ]) W# T# t
                swap(&list,&list[begin]);
    2 P8 d8 J5 l3 N1 b
                perm(list,begin+1,end);
    $ q4 X0 L4 X& h
                swap(&list,&list[begin]);$ M+ P' w! ?- u" U  A
            }3 p! L7 }" ?4 f
    }//perm
    & u- v' @' L( ~+ d% v& W  }* T5 U! A7 L4 e
    void main(){
    * c0 A- K4 W. I
        ElemType list[]={1,2,3};
    6 X* O/ [+ K9 Q/ H
        perm(list,0,2);
    & ?$ V3 d9 K/ l1 ]7 H0 t1 t
    }
      l, f- r: ]% D, Q+ v; S, W5 t7 I

    4 g( N8 q, F% e- k. h6 w& i$ X% ~+ W$ @1 f- w

    0 d& B& L' w. E
    C++代码 #include <iostream>
    8 m  T# f  L/ ]; R' S2 ]
    8 s, _. E) |. `6 b4 N. ctemplate
    <class _Ty>
    1 L& g1 S' r1 e3 c" ^6 pvoid perm(_Ty list[],int begin,int end){
    ( e5 f- X3 F: Z" V! E4 V   
    //输出前缀为"list[0..begin]"后缀为"list[begin+1..end]的全排列"---这名话很重要;
    6 b' a+ k9 C( W# G, [. c5 c   
    //前缀是固定的,求后缀的时候要用递归求) t, g1 h, g. L4 B# \1 r0 X6 ?( ~$ K. Q
    , e, k: Y2 K" r  p
    if(begin==end){% O# G( T- Z) B
            
    //如果相等,则表明前缀为list[0..end],后缀就没有,所以直接输出前缀+ E2 `3 d( f+ l0 C
    9 Q' [. N8 W' @1 a. L+ @' h
    for(int i=0;i<=begin;i++)
    # K! M% \. G% t' ^8 Q            std::cout
    <<list;
    6 B  [, ]2 i( M) h        std::cout
    <<std::endl;//输出一个之后,换行7 Z3 ~8 P2 u% k& g
        }
    7 j6 q- Q4 _6 c# U   
    else{+ u, ]# z9 U+ S( T% [% c9 d
            
    //如果不相等,就要循环(end-begin)次,每次前缀都不同* \% H5 S% F2 c! a
    , i+ ~6 O9 l& o5 Z% N% F& O" V# }
    for(int i=begin;i<=end;i++){
    - ?' f% R* G0 j! E            std::swap(list,list[begin]);
    //交换之后就可以得到前缀了
    / i, _9 S4 P5 t! q% M& b/ w8 o* l            perm(list,begin+1,end);//递归输出, j8 t0 o3 n* o0 ?
                std::swap(list,list[begin]);//换回来0 {5 I4 Y( ?- }3 O2 H
            }# p# r2 |4 A7 k( b
        }
    ; o5 s9 F. K- u}
    ! r+ P; g5 i; L5 i' t/ a/ k9 l
    $ ^  g, O8 f, S2 J4 }
    void main(){/ P: X; U; v1 k" G1 C
       
    int list[]={1,2,3};
    5 Q/ e) w" z% y    perm(list,
    0,2);
    4 h  ?* ?$ c0 J* \5 @}
    & X) P$ M8 f% |5 W0 s8 h9 V: n

    6 c, M, X% Q9 ~* t9 _
    " d* ^) D0 ?! q6 g ContractedBlock.gif ExpandedBlockStart.gif C#源码 using System;
    ' g$ f4 |8 s' T2 l/ V  B+ X9 ~! _
    using System.Collections.Generic;/ ?4 b, L: ~  y! L4 ~4 S0 [7 E) o

    9 O  S7 B; h- ~, s: E
    namespace CSharpDemo
    / V( l' X0 W* c/ c3 a4 g{
    * L  A6 _$ S- `0 R5 K   
    class Program
    4 s9 u3 P. w" c& e1 |# L1 V    {% O- s- ^+ F/ e- r0 I  x
            
    public
    - p0 e+ ^  a6 K, S7 S/ ]% {static9 J% A2 ~$ l7 v5 u
    void Swap<T>(ref T a, ref T b)" A: R7 N" _: e4 J2 U9 A
            {$ Z7 _2 g$ {( r
                T temp
    = a;
    / @- H0 Z5 p  q3 Y  d, F9 }- `5 Z7 @4 d            a
    = b;
    6 ?4 ^( x3 @$ ]; v( N& s1 D/ T+ p            b
    = a;& B; ~$ H  x8 j9 c. e9 N
            }: r( C6 ?# b4 \" s1 \) C
    4 w! |) ~3 x& ~- r; O) W5 p
            
    public4 h  n1 p) e+ j- J' l# m5 u5 M" d7 L! f
    static
    ' g% o8 q2 C3 G: `4 m( ivoid Perm<T>(T[] list, int begin, int end)# f0 u, g/ q/ p
            {
    . u. I, @7 i8 a1 S: E            
    if (begin == end)0 n' w9 I' m, R
                {: C) _. ?2 u* U
                   
    for (int i =' M/ L4 R# j1 P: R/ h" s
    0; i <= begin; i++)
    6 @# n6 Q' u) D) B8 X! R5 M& s                    Console.Write(list);: z* v3 ~& @* ^: O2 U+ w
                    Console.WriteLine();
      ?7 D3 p- n- j4 X            }$ z/ I, T  O9 |0 F4 K- y
                
    else6 |6 v% H/ b  i& ^( a4 ]
    for (int i = begin; i <= end; i++)
    / r7 t- _. G9 w) X) k3 s                {% I* ~% _; h$ q9 t! f; h& N  E+ a
                        Swap
    <T>(ref list, ref list[begin]);4 x, _9 a, n2 G- h# G$ `. B
                        Perm
    <T>(list, begin+1, end);
    $ `* K3 G/ f. e7 P% Y                    Swap
    <T>(ref list, ref list[begin]);
    5 B# ]* u1 D5 e7 |& ^9 C: V: s6 X                }
    9 j' z8 o, ]4 v+ Q# j6 v. V        }' o$ ~( ~, v1 ]' \1 W+ |. f0 [
    ' Q+ a) `' g2 p# \$ p  z
            
    static9 r; n3 q' q" ~6 b# B. d3 C
    void Main(string[] args)
    0 r/ t0 v/ ]+ O0 ~/ P        {/ f% S# S8 `' `# b% T: a+ _. k
                
    int[] list ={ 1, 2, 3 };, \! L- f- l( w) ^+ ?6 b8 S
                Perm
    <int>(list, 0, 2);
    & u. o3 ~+ F2 s' |' [% \6 w5 B        }2 d) M* l  I1 _
        }3 O# n, o, f3 O9 Q# u6 V& C+ Z
    }1 ?" t- K( s8 n. z

    评分

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

    查看全部评分

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

    该用户从未签到

    尚未签到

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

    本版积分规则

    招聘斑竹

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

    GMT+8, 2026-3-18 09:19

    Powered by Discuz! X3.5 Licensed

    © 2001-2025 Discuz! Team.

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