QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4306|回复: 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语言
    % ~; j$ @, q0 Z

    直接插入排序法

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


    - n" X% o$ |5 b2 Z//插入排序法
    9 |! y/ V. o, l/ R) bvoid straightsort(int*arr,int len)
    + t' o( n; P, F  |, M$ i{( Q& o8 T  Z  F; ^- M
            int temp,i,j;" B( d2 C: s" P- K& _  m) [( s; i
            for(i=1;i<len;i++)//将首元素看成有序数组,i=1表示从第二个元素开始排序+ s2 K9 [7 W% o6 ~- T7 m* ?+ O7 E
            {
    8 L  I3 @* g- f                temp=arr;//temp存放待插入元素
      u* B( L! d" z+ }# ^+ Z" g* @0 ?  P' D                for(j=i-1;j>=0&&arr[j]>temp;j--)//待插入元素向左比较,arr[j]代表已经排序的有序数组,满足j>=0,且arr[j]>temp
    0 a5 x6 ^% C6 x" A- X                {
    . p: c* e1 m' }; h1 N$ a! N# K                        arr[j+1]=arr[j];//若条件成立,则将已排序数组向右移位,arr[j]最大可达arr处,即temp处
    # ?* _% w2 h5 s) _9 v& [0 J                }
    4 B: d, e* H1 N  U* g/ r; S                arr[j+1]=temp;//当循环不成立或循环终止,此时arr[j]<=temp(或j=-1,所有有序数组都大于待排元素,)temp应位于arr[j+1]处,j随temp左移而发生变化(减小)1 h5 x# ]6 ?5 R+ |/ t( |2 J/ h
            }5 B2 S+ s4 Y/ a9 b1 a" Z0 W+ h' O
    }2 N/ V' G) R( K3 n5 j& y9 e. r
    . b$ r  c$ A; E; V% k6 \- E

    归并排序法

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

    7 X+ q/ C4 Z- A$ i4 h
    //归并排序法
    8 A3 y' P$ r6 @1 G0 |' `void merge_sort(float data[],int left,int right,float sorted_data[])
    0 r. ^' Z7 U0 P: r0 H. d8 L+ C{$ z6 \$ ~" o2 h) W6 W5 j9 k+ s; k7 U
            if(left<right)//排除原数组出现只有一个数据的情况(left=right), L( h$ C1 b  }% }" a
            {
    ( ]2 V, P- ]  V- h6 O) R2 r- g1 a                int mid=(left+right)/2;4 R$ e6 B$ u+ s( T9 e/ C- ~; w" g$ K6 S
                    merge_sort(data,left,mid,sorted_data);
    " U& H* R4 A& H                merge_sort(data,min+1,right,sorted_data);) `. Y' b4 d2 S" L! u" u
                    merge_array(data,left,mid,right,sorted_data);$ h  g% \3 |- Z4 \* ^$ D
            }/ |+ k- ]& d# |# ]5 R; y( j/ E
    }
    6 G  w' r* _' g5 n( ]: P, Qvoid merge_array(float data[],int left,int mid,int right,float temp[])//data[]即待排子数组,直接用子数组排序,但将子数组分为两部分,temp[]即临时数组% ~1 X  C, r  K
    {& x' s% M5 x6 }  N1 W
            int i=left,j=mid+1;
    " y& N- @9 W$ j' K! Z4 J        int k=0;- P8 o* l0 ?, D; k
            while(i<=mid&&j<=right)//循环条件,将较小数组放入临时数组temp[]中,同时i变为data[i+1]或j变为data[j+1]
    $ P$ W5 E0 X" o4 w/ Y2 G) r        {
    8 I9 x! n8 G/ S+ r9 q                if(data<=data[j])
    + O& V6 F; x0 v' R' I                {
    8 I! g/ s. ^" q3 E                        temp[k++]=data[i++];
    ! j. _8 L" L* U7 w5 t, N                }6 A* n' d. Q; W+ c
                    else
    , X5 ^7 k- s2 \                        temp[k++]=data[j++];
    + V8 o  T7 j: t& R+ i5 w+ S- W5 ^        }
      H% i1 q9 C0 y5 o2 s9 U8 h7 k        while(i<=mid)//以下两个while代表可能出现的特殊情况:i/j所在数组已经全部完成排序,但另一数组仍有>=1的元素未放入临时数组中
    % |" N9 [, {4 ~- F, y                temp[k++]=data[i++];
    ' y; X/ a$ R7 x' G, Y        while(j<=right)# V: ]* h4 ^1 {
                    temp[k++]=data[j++];
    6 j5 f% g( y7 M) ^' I# O8 e8 e        for(i=0;i<k;i++)//将临时数组中的元素全部放入原数组中,k=right-left,k代表了数组长度5 h% ^* z" a0 R1 i
                    data[left+i]=temp;7 ~: y5 I; ^$ h( g0 F
    }/ u. E5 v" C3 m
    void merge_array(float data[],int left,int mid,int right,float temp[])//哨兵简化+ U2 A& r* ]6 ~% q' C6 b2 f* N
    {
    2 s1 {' a; v' j8 _$ p        int max_num=INT_MAX;
    ' M; y. ~: S, P6 ?( D+ U8 J        int len=right-left+1;8 F: R! ~' X. E2 G& ?
            int data_left=new int [mid-left+2];7 w" U  i4 j: Z0 r
            int data_right=new int [right-mid+1];0 D' _; z7 G! O5 R! y0 V, k
            int i=0,j=0,k=0;' P$ l% m/ o6 W! r9 c8 X$ a0 l. ?
            for(int k=left;k<=mid;k++). Y* _7 d- R% ^. e* F: ]5 a% n2 ?( p
                    data_left[k-left]=data[k];
    # w' h7 h# u6 Q        data_left[k-left]=max_num;
    4 M( E) J$ I% h, p3 o  L; f        for(int k=mid+i;k<=right;k++)
    6 t  ?9 _9 O, v* ^5 x# |1 d                data_right[k-mid-1]=data[k];
    - X8 R1 z5 x3 Z. P        data_right[k-mid-1]=max_num;
    ! Y+ Z$ D4 _% E. n, N7 w* [6 p5 r% W        for(int k=0;k<len;k++)$ U) u* Z* K5 b+ }0 s1 g' L# W
            {! k! f! h: ~6 S7 `
                    if(data_left<=data_right[j])
    2 u: L' ]" p! [                        data[k+left]=data_left[i++];+ w1 Q+ i1 `7 e+ i5 P; `
                    else0 C: E, Z4 o' ?5 q8 H' {6 {2 p
                            data[k+left]=data_right[j++];
    / L: i5 _, a1 T5 v/ K8 L: _        }7 i/ \; q: R  U; a6 [9 K! E, L# h
    }
    2 c* d+ ]* y, M: K" c( _
    , l3 I& L/ T1 v1 [: A) M/ c$ k: x$ a7 I! H
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信

    1178

    主题

    15

    听众

    1万

    积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    涂真锦 发表于 2021-11-29 17:54 8 w/ m# }; @8 U* [2 D; y
    收藏,必须收藏啊

    ; ~8 H" L6 R4 }/ L( F, a. J点赞
    # N5 C" E0 x$ H$ [$ V8 s" O
    回复

    使用道具 举报

    涂真锦        

    1

    主题

    2

    听众

    141

    积分

    升级  20.5%

  • TA的每日心情

    2022-10-30 20:19
  • 签到天数: 37 天

    [LV.5]常住居民I

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

    收藏,必须收藏啊8 v0 f0 z5 Y( T5 T' n

    点评

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

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-7-20 05:54 , Processed in 0.382286 second(s), 63 queries .

    回顶部