QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4504|回复: 2
打印 上一主题 下一主题

无C不行-废物一个-算法导论:C语言

[复制链接]
字体大小: 正常 放大

1178

主题

15

听众

1万

积分

  • TA的每日心情
    开心
    2023-7-31 10:17
  • 签到天数: 198 天

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-11-28 01:29 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
                                                无C不行,废物一个,算法导论:C语言
    5 @  f: ^1 `: E. m3 x" @

    直接插入排序法

    原理:从无序数列向左遍历,从有序数组向左比较


    $ n7 c+ B/ Y$ {# ?//插入排序法
    ' m* n/ J; c& z7 W6 i5 p  Q% {void straightsort(int*arr,int len)! V( H. t9 M- K/ V" g! M
    {/ {/ `! G9 N& Z- d3 d
            int temp,i,j;
    , F  I% {/ }) Q5 a        for(i=1;i<len;i++)//将首元素看成有序数组,i=1表示从第二个元素开始排序& [, C3 c2 |  `  K5 U) O! @
            {
    . m* H5 R( v0 P5 L0 B                temp=arr;//temp存放待插入元素1 k7 c5 o  w/ u
                    for(j=i-1;j>=0&&arr[j]>temp;j--)//待插入元素向左比较,arr[j]代表已经排序的有序数组,满足j>=0,且arr[j]>temp
    " t1 T' d0 o, m' }0 h& d                {8 D" C9 H+ j' [( E. @; c
                            arr[j+1]=arr[j];//若条件成立,则将已排序数组向右移位,arr[j]最大可达arr处,即temp处
    9 ?/ P% B0 a6 w" \9 n                }( N% ]7 [: p8 G) j9 P+ z
                    arr[j+1]=temp;//当循环不成立或循环终止,此时arr[j]<=temp(或j=-1,所有有序数组都大于待排元素,)temp应位于arr[j+1]处,j随temp左移而发生变化(减小)
      C# M9 Q6 v' e* `+ O$ w        }
    + U% {1 I' R9 D% Q4 z7 z2 R- }}
    " N: |" l% J: P1 M3 b7 H& s- q0 u# @9 ?0 L# m/ [1 i

    归并排序法

    将一个数组从中间分为两部分,再分别对两部分进行排序(递归),最后将排好序的两部分对比合并

    2 H" y/ |% U1 F" h* E
    //归并排序法8 y; x$ P% R& F% D. @
    void merge_sort(float data[],int left,int right,float sorted_data[])
    ' j7 t2 J) R; w8 I4 {3 ]8 B{: C( n# s4 ?2 A( e0 j. Q
            if(left<right)//排除原数组出现只有一个数据的情况(left=right)6 W! T# `7 Z- N1 l
            {, j( c; L! R* z! n  y
                    int mid=(left+right)/2;( H# J# q, H( X
                    merge_sort(data,left,mid,sorted_data);
    " Q! T! b0 ?- g8 g& y, H/ s% _                merge_sort(data,min+1,right,sorted_data);: q9 B1 ?3 }% f" A8 L
                    merge_array(data,left,mid,right,sorted_data);
    + W% k8 g+ q' i& f! _, }6 B        }
    * T6 v; g  I8 f, }( H}- `& [) w+ s% x  Z
    void merge_array(float data[],int left,int mid,int right,float temp[])//data[]即待排子数组,直接用子数组排序,但将子数组分为两部分,temp[]即临时数组- R2 J( j: m7 {4 }, T; A: z
    {5 Z5 \, F. H- f6 w0 m7 j
            int i=left,j=mid+1;
    9 K2 K8 V8 w# w' Z        int k=0;
    ; q- f' R! ~% V. s( v, z7 c        while(i<=mid&&j<=right)//循环条件,将较小数组放入临时数组temp[]中,同时i变为data[i+1]或j变为data[j+1]# V- S( \! E: Z  @9 R; J) y# u
            {6 f! x& H9 g5 B) L! S- P. J4 s$ q
                    if(data<=data[j])
    9 Q" U* _: @- Q                {% ~; z5 R: l) t. Z1 z' s% f
                            temp[k++]=data[i++];) W3 Q( C/ J/ R) U% x8 t
                    }
    & z' |/ K3 [' k4 y                else
    ' C: v& R5 B6 k" O: ]( ?& K! m                        temp[k++]=data[j++];( i) d# Q3 ~7 B
            }; [: Y# ]& y) J' x
            while(i<=mid)//以下两个while代表可能出现的特殊情况:i/j所在数组已经全部完成排序,但另一数组仍有>=1的元素未放入临时数组中
    - `, f* N! Z2 \/ I' L; Q9 i0 X                temp[k++]=data[i++];& H  @8 P; m/ J; `  Q1 T4 c0 I. ?7 W
            while(j<=right)
    ; F+ [' `8 k' J. q: t# b7 Y                temp[k++]=data[j++];
    " Y1 O$ o" g% }' }        for(i=0;i<k;i++)//将临时数组中的元素全部放入原数组中,k=right-left,k代表了数组长度! n! a+ I" B2 [$ m6 g
                    data[left+i]=temp;3 Z# o- s3 u6 m* z( H" c$ n
    }( R: g. W* @( M3 @! e6 T5 q; s
    void merge_array(float data[],int left,int mid,int right,float temp[])//哨兵简化
    ! C' ?, a( D3 e' t% ]- p: V{; r/ S+ |! F) [. P1 i
            int max_num=INT_MAX;4 y0 j& P4 v( p* d
            int len=right-left+1;
    . _+ B% H- I9 T0 R& J        int data_left=new int [mid-left+2];, c2 i  L2 g. L9 d: v
            int data_right=new int [right-mid+1];
      c, \0 b' x; t; f* f$ x        int i=0,j=0,k=0;
    ( T$ N  E  A. W! x: ?1 N0 i        for(int k=left;k<=mid;k++)
    1 w5 M: X& }$ p5 ~# G                data_left[k-left]=data[k];. E1 y* {  A2 X% x% `7 N* h8 y  w0 D
            data_left[k-left]=max_num;
    5 D9 h: F, f+ R        for(int k=mid+i;k<=right;k++)
    * Y8 y5 B6 x8 B                data_right[k-mid-1]=data[k];
    - g4 m! T) Y& ~7 y+ t( p/ [$ i        data_right[k-mid-1]=max_num;
    / J  k& H% j9 B* M1 }& c5 }: f; [        for(int k=0;k<len;k++)
    1 s7 g: U; A1 v9 I" Y        {
    # Y% y& k2 v  C% c' d5 k; {6 `                if(data_left<=data_right[j])
    * ?8 N( p7 b% k6 X" y0 G                        data[k+left]=data_left[i++];
    & x0 K9 i; ]; {7 S$ Y% K6 K9 U" `                else
    $ C3 _7 l$ i/ N' g2 D  h                        data[k+left]=data_right[j++];
    ( `" O) V0 r' D! M' ^2 a! H* _        }( X9 I" D& {9 C! e9 x0 h0 ?
    }
    ; I- y" t% B* G9 N8 m4 A0 O* a
    0 @7 }% I  u( H
    & f+ |2 H0 H, M3 k9 y7 _
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    涂真锦        

    1

    主题

    2

    听众

    141

    积分

    升级  20.5%

  • TA的每日心情
    衰
    2022-10-30 20:19
  • 签到天数: 37 天

    [LV.5]常住居民I

  • TA的关系
  • 邮箱绑定达人

    收藏,必须收藏啊# [" w' t# a2 x# l

    点评

    1047521767  点赞  详情 回复 发表于 2021-11-30 11:13
    回复

    使用道具 举报

    1178

    主题

    15

    听众

    1万

    积分

  • TA的每日心情
    开心
    2023-7-31 10:17
  • 签到天数: 198 天

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    涂真锦 发表于 2021-11-29 17:54 / n4 t/ H& \2 H/ x0 V1 t
    收藏,必须收藏啊
    1 \9 H# F% `1 P) F
    点赞
    " [8 r& F* z& X) q, e" F
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-10-23 05:17 , Processed in 1.271668 second(s), 63 queries .

    回顶部