QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4235|回复: 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 T3 p1 d+ l- t% {) ]. }

    直接插入排序法

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


    $ V# R8 V4 V  P2 |//插入排序法
    ' t1 q/ U9 R. M0 S9 xvoid straightsort(int*arr,int len)/ \1 N- p( D, k3 i: [. X
    {1 l7 H7 Q8 v* G- o4 W
            int temp,i,j;
    3 B. C3 ?0 q+ K& `* e        for(i=1;i<len;i++)//将首元素看成有序数组,i=1表示从第二个元素开始排序
    ' \4 I! @; |! n2 a        {
    & N8 V% u9 c4 H9 a                temp=arr;//temp存放待插入元素3 {" A6 N+ I8 }6 h: o5 Y- Q
                    for(j=i-1;j>=0&&arr[j]>temp;j--)//待插入元素向左比较,arr[j]代表已经排序的有序数组,满足j>=0,且arr[j]>temp
    1 J8 K  `; ~& ^" n                {% L, p3 V1 h& `( t0 P8 a3 K; O
                            arr[j+1]=arr[j];//若条件成立,则将已排序数组向右移位,arr[j]最大可达arr处,即temp处- \+ T9 L% u: ?% a1 i, v
                    }/ [% b1 N" i, J+ _0 ?5 l$ |
                    arr[j+1]=temp;//当循环不成立或循环终止,此时arr[j]<=temp(或j=-1,所有有序数组都大于待排元素,)temp应位于arr[j+1]处,j随temp左移而发生变化(减小)
    ) A0 F, a! x; ~; ~! o        }
    * o2 y0 g3 J; z/ B}
    ' g7 b; D) m& o6 m# r6 F& b+ v$ o) d, C; c& \0 Z

    归并排序法

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

    0 u; k" M+ O5 J& x+ ?0 Y
    //归并排序法0 X6 O8 L, L/ k3 T9 g
    void merge_sort(float data[],int left,int right,float sorted_data[])$ m; k! \8 x. ?, B. `! z
    {
    4 E4 O5 n/ {; H8 G+ e9 N/ _/ f        if(left<right)//排除原数组出现只有一个数据的情况(left=right)  c, u* U( C' g, u4 T7 T$ c# ?
            {% L5 t* f, |) Q9 `3 o3 C- Y
                    int mid=(left+right)/2;5 D2 s4 m9 |( r
                    merge_sort(data,left,mid,sorted_data);
    - \2 C+ x% t% Z3 v7 o! F3 D7 [                merge_sort(data,min+1,right,sorted_data);
    & [  s. l- ]/ \! t6 Q# a                merge_array(data,left,mid,right,sorted_data);# a/ w/ [3 c# j! L4 G/ n0 Q
            }
    0 ^, Q! L0 e7 j' N; J}
    3 p- O6 E8 b8 U* Q' `- y' a$ uvoid merge_array(float data[],int left,int mid,int right,float temp[])//data[]即待排子数组,直接用子数组排序,但将子数组分为两部分,temp[]即临时数组
    3 |- K7 {& c! `& c4 P) K1 V) z  u{
    # s$ e0 R1 E8 r6 X0 V1 ~0 l* r        int i=left,j=mid+1;, |+ f0 _$ Y3 M% U, p: u' l) L
            int k=0;: k" I; z, O; I0 G4 T+ P( j" f
            while(i<=mid&&j<=right)//循环条件,将较小数组放入临时数组temp[]中,同时i变为data[i+1]或j变为data[j+1]
    ! g' R' j, L4 H5 ^3 U. W. E        {
    & w9 r/ v: g. I% a& D                if(data<=data[j])+ Z3 z2 ?3 X5 j, P( W% ]
                    {6 t: `$ Y* N" H0 N
                            temp[k++]=data[i++];
    # ?0 m2 |% I+ h; ]' C; V5 m+ B                }6 \" ~9 C6 s1 Q1 p& |
                    else8 J$ s% k% ~9 _/ w0 _
                            temp[k++]=data[j++];
    0 Z) j, O" U+ g        }  V, o# j8 F8 _8 Y% ^# W* h
            while(i<=mid)//以下两个while代表可能出现的特殊情况:i/j所在数组已经全部完成排序,但另一数组仍有>=1的元素未放入临时数组中* y; Y: v5 [# f% j; m# z2 i" g
                    temp[k++]=data[i++];7 v/ v+ V8 V; s% E# r* E
            while(j<=right); [. N0 V; H! u" Y1 a8 O
                    temp[k++]=data[j++];5 O( p( |; S: C, r
            for(i=0;i<k;i++)//将临时数组中的元素全部放入原数组中,k=right-left,k代表了数组长度
    ! h3 x: V; P+ b                data[left+i]=temp;
    8 p4 d& r1 V6 U: o( d, m}
    / @+ s, e3 Z3 d" V  xvoid merge_array(float data[],int left,int mid,int right,float temp[])//哨兵简化
    3 j( o( h. ?8 i" ^3 V& r# c{8 C1 x7 z( }) ~! n8 F! U
            int max_num=INT_MAX;
    " {0 m8 ~( c; q4 c# q, C1 h( X9 c        int len=right-left+1;" g# M  B8 u% l% ?0 n5 q" q2 e( J
            int data_left=new int [mid-left+2];
    1 N- d; X! w# F: K        int data_right=new int [right-mid+1];
    6 p% B+ {1 S; Y" `$ h        int i=0,j=0,k=0;3 ^, O; j; Z: C7 [" `% c. b, {
            for(int k=left;k<=mid;k++)- Q6 S  B3 G( F/ a1 u
                    data_left[k-left]=data[k];
    . f  C) a+ V3 C. G. Z$ B3 W  G' C: p        data_left[k-left]=max_num;
    ' A/ d1 z. J3 h0 @$ E  I        for(int k=mid+i;k<=right;k++)
    % A% \* w& M- {  Z0 O                data_right[k-mid-1]=data[k];
    : r. w% f  Y% G$ W        data_right[k-mid-1]=max_num;' B) i* Q6 |0 c" q- Z
            for(int k=0;k<len;k++)2 E, E- o/ d* Z: B
            {* Z8 L/ O8 M% v4 d7 O
                    if(data_left<=data_right[j])
    3 i* j. ]' R3 J. X: [( D                        data[k+left]=data_left[i++];. l% C0 G. T- Y. Y! h3 P+ v
                    else
    ; a! [+ ^! `, e" R- K                        data[k+left]=data_right[j++];
    / R: q9 T' Q8 L" R6 V7 {; f        }
    9 k& _+ y' v. p& A! ^% Z}8 `( k* Y( p6 W; v3 p- H5 b, K2 z2 M

    - V) `% u! z) R6 ]+ `9 ~
    6 @" w- H5 c; f5 I2 x" O5 ?2 I! L  }
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    涂真锦        

    1

    主题

    2

    听众

    141

    积分

    升级  20.5%

  • TA的每日心情

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

    [LV.5]常住居民I

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

    收藏,必须收藏啊. h$ C7 S; n" k0 j5 A0 E, 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
    + ?+ Y" `7 {; V' r0 c( Y收藏,必须收藏啊

    ! P1 P0 T" r6 h; T4 \& W( S  ]& Z9 ~点赞- b: }( Z. Z. ]9 T8 a: e
    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-4-21 17:31 , Processed in 0.434841 second(s), 63 queries .

    回顶部