QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4508|回复: 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语言
    / l5 S& G3 T0 k

    直接插入排序法

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


    + M$ [; v7 \! q2 m9 c//插入排序法! T' ~; i  k, l* M1 W
    void straightsort(int*arr,int len)# v/ W% \# D" D6 ^3 U0 G( o
    {
    2 i& O0 Q4 K6 h" b% h7 ~$ ~  Q: t8 g        int temp,i,j;
    + p1 @1 f' R: p& I# s+ V6 K        for(i=1;i<len;i++)//将首元素看成有序数组,i=1表示从第二个元素开始排序7 V% d( c, c/ ^7 S- W. G
            {; f  V  M8 z. j0 h+ [: M* k
                    temp=arr;//temp存放待插入元素
    % l  [7 h4 g* `1 H) S                for(j=i-1;j>=0&&arr[j]>temp;j--)//待插入元素向左比较,arr[j]代表已经排序的有序数组,满足j>=0,且arr[j]>temp
    ' Y- u: s2 J7 U" J8 D! S2 o                {8 b/ R* N/ z, q, m
                            arr[j+1]=arr[j];//若条件成立,则将已排序数组向右移位,arr[j]最大可达arr处,即temp处0 E' L" i' ^* G% x* j! r' W! e
                    }
    9 v2 B% I( P8 A6 M. Z" B                arr[j+1]=temp;//当循环不成立或循环终止,此时arr[j]<=temp(或j=-1,所有有序数组都大于待排元素,)temp应位于arr[j+1]处,j随temp左移而发生变化(减小)
    1 F0 i- j  u! m( C% W        }/ t* l( D: v2 K
    }( S8 G; M1 F: c5 T! [+ s" O# W/ ^
    ; J9 r7 B/ V. C6 y0 H" H9 Z

    归并排序法

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

    ' l0 v8 Z" ]0 w+ _! s* D4 b
    //归并排序法
    % ^% n. w. i" {. y  _void merge_sort(float data[],int left,int right,float sorted_data[])
    4 E% C3 w: m7 G" _. i8 w{/ _0 i9 v. J: I$ C; b2 }+ z
            if(left<right)//排除原数组出现只有一个数据的情况(left=right)
    5 G' ?. R/ c2 B( i" ?        {, H2 ~7 ^8 E* ?* b6 R
                    int mid=(left+right)/2;: n0 v. S& l9 E7 X# f9 g
                    merge_sort(data,left,mid,sorted_data);
    $ P: r; d: X# V: F                merge_sort(data,min+1,right,sorted_data);
    ! C  g0 B( K4 F* S                merge_array(data,left,mid,right,sorted_data);3 _' N! I; `. i4 i
            }* K; U# m, \- a- k) S8 x9 }* \
    }. d- ~; B; T0 l( j1 U
    void merge_array(float data[],int left,int mid,int right,float temp[])//data[]即待排子数组,直接用子数组排序,但将子数组分为两部分,temp[]即临时数组
    2 P" t( G& ^! Z4 J( S, [{* `: J9 H" O  [: @! }% k' n/ q9 ]
            int i=left,j=mid+1;
    ' }' C5 \+ [. @- y  T7 d& J        int k=0;
    7 {9 c7 k; r4 n. B+ r. [        while(i<=mid&&j<=right)//循环条件,将较小数组放入临时数组temp[]中,同时i变为data[i+1]或j变为data[j+1]9 K9 E- i0 h  c1 i1 J9 x3 ]7 l
            {; [) i+ j$ z0 A. \$ c
                    if(data<=data[j])
    1 s9 r2 O* ]3 m) y3 h3 D. @                {
    " h- N4 L# ~7 u# K                        temp[k++]=data[i++];2 x8 C# k2 e2 \  ^( E7 n
                    }6 R; M2 @# p' J- ~' x
                    else
    # ?5 l' }. V* \2 v                        temp[k++]=data[j++];% I2 M2 a9 R' \* T3 V& v
            }1 [# H8 i- n1 }. v( {5 R
            while(i<=mid)//以下两个while代表可能出现的特殊情况:i/j所在数组已经全部完成排序,但另一数组仍有>=1的元素未放入临时数组中) p" h4 o* e- }/ e
                    temp[k++]=data[i++];
    3 A  a* g  I3 u. }; i        while(j<=right)
    7 r3 Y( k: S( r2 p9 m; C, @. Q                temp[k++]=data[j++];
    2 w( P7 w2 @) I, c' n2 {3 ^        for(i=0;i<k;i++)//将临时数组中的元素全部放入原数组中,k=right-left,k代表了数组长度7 P1 M: L4 T$ X7 ^4 j
                    data[left+i]=temp;8 M1 F' n) C/ ~8 z% |
    }
    " C6 J( T. x- U' }6 r  j/ \void merge_array(float data[],int left,int mid,int right,float temp[])//哨兵简化  W) n9 K+ D0 {  i) u
    {& U# d+ u0 F* U) w
            int max_num=INT_MAX;) l2 z8 n  K# ]; a' l- x# u
            int len=right-left+1;# o# V4 ?! Z8 [# D: n# U
            int data_left=new int [mid-left+2];  f1 A1 r- a( p
            int data_right=new int [right-mid+1];
    + t* H, j4 Q9 S, ]* }3 \        int i=0,j=0,k=0;
    9 m1 P; g: o- \& I' ?        for(int k=left;k<=mid;k++). ?4 x- L2 x  S/ s+ n' e& T0 r
                    data_left[k-left]=data[k];
    # [# Z$ Z2 |% p5 \" V0 }1 P, X& @        data_left[k-left]=max_num;- x* X: c( k- J5 k
            for(int k=mid+i;k<=right;k++); f+ o; z8 ~0 |) D' T/ O
                    data_right[k-mid-1]=data[k];
    : k2 a2 l2 ]( i4 \! G8 z        data_right[k-mid-1]=max_num;
    $ t6 D7 o: c/ @4 M: O% s        for(int k=0;k<len;k++)+ x; B: Z3 }$ }  s! I, g
            {1 o0 a/ g- c: X  B( _
                    if(data_left<=data_right[j]); c( ?( X" p# h3 H: l
                            data[k+left]=data_left[i++];6 P) k% A6 k& p0 ~2 n6 i& `8 h
                    else/ O5 s/ Z5 |% x! R
                            data[k+left]=data_right[j++];% b; P5 ?2 K: X" F% w
            }
    ' M& n) D0 p1 Z' g! J}
    + e- p* I  e2 D4 p8 ^/ t9 M; a. L& ]: H$ U! n6 w
    3 X! N& }5 ^! \
    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 : S% T1 c& O. L$ A
    收藏,必须收藏啊

    ' l( y3 u+ T: [3 O! x点赞
    1 ?# p3 ~; Y( a; T4 ]- t
    回复

    使用道具 举报

    涂真锦        

    1

    主题

    2

    听众

    141

    积分

    升级  20.5%

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

    [LV.5]常住居民I

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

    收藏,必须收藏啊
    7 @5 `1 [8 p1 e( x" m

    点评

    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-10-24 02:18 , Processed in 0.516608 second(s), 64 queries .

    回顶部