QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4553|回复: 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语言
    1 _/ P9 U5 X2 f' d

    直接插入排序法

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


    ) X& h! c2 y+ Z0 h) g' P//插入排序法) \: |5 u" k  y$ a' N
    void straightsort(int*arr,int len)& J# t& a7 [: a
    {
    1 y3 w# u. A2 C( k+ |        int temp,i,j;8 F5 F5 R) [; `8 C8 J) }, z6 s1 n
            for(i=1;i<len;i++)//将首元素看成有序数组,i=1表示从第二个元素开始排序
    9 F1 Z2 b3 Y# s4 K2 b. a: Q5 A7 f& x        {
    , Y5 i6 m/ P9 @  A4 S, s                temp=arr;//temp存放待插入元素
    ; U! I7 [9 P+ C                for(j=i-1;j>=0&&arr[j]>temp;j--)//待插入元素向左比较,arr[j]代表已经排序的有序数组,满足j>=0,且arr[j]>temp1 J1 D  F* n9 `2 T% x+ x$ l
                    {
      }+ E# v3 g7 @, v                        arr[j+1]=arr[j];//若条件成立,则将已排序数组向右移位,arr[j]最大可达arr处,即temp处2 R; |' }# g1 ^+ s" j
                    }
    , g  I; D( T7 D# u4 x                arr[j+1]=temp;//当循环不成立或循环终止,此时arr[j]<=temp(或j=-1,所有有序数组都大于待排元素,)temp应位于arr[j+1]处,j随temp左移而发生变化(减小)
    8 t  B" g0 l+ P2 F& q3 Y9 f        }$ F% n) q4 {3 M( J! ^
    }* Z9 I  w2 S- }5 N+ u
    7 E8 @& [" M# j, K8 [

    归并排序法

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


    - s0 r' L. O* l* g//归并排序法& p# b. ?$ e  r8 c
    void merge_sort(float data[],int left,int right,float sorted_data[])- @7 G2 z0 k8 Z/ O' X/ {
    {( A. \! j, m: C* Q* K7 X
            if(left<right)//排除原数组出现只有一个数据的情况(left=right)
    $ y- S1 H# Y5 u# v% \        {2 m: j( m. X% S! D! n
                    int mid=(left+right)/2;
    2 a( K: J! g. T2 U                merge_sort(data,left,mid,sorted_data);
    # p. @' g3 t, ]/ O2 n; c% u                merge_sort(data,min+1,right,sorted_data);# P4 B* C2 s0 T* S
                    merge_array(data,left,mid,right,sorted_data);, k% r+ S5 C; E; E- Y
            }6 y8 ]; R3 O) h
    }% V7 h( E& ~) H- k/ A+ H$ H
    void merge_array(float data[],int left,int mid,int right,float temp[])//data[]即待排子数组,直接用子数组排序,但将子数组分为两部分,temp[]即临时数组7 {8 {1 ?+ }  G! o/ j; a) g
    {
    ! p: t$ g- t+ E  E( g, x' j3 G        int i=left,j=mid+1;
    # m. O( y) N& ^6 V* {        int k=0;* }( g5 A; v. A9 Q4 F9 Z& `1 j
            while(i<=mid&&j<=right)//循环条件,将较小数组放入临时数组temp[]中,同时i变为data[i+1]或j变为data[j+1]( }' k6 L2 q& x$ S; E, s- J, C% `4 C
            {& `3 j, x" Q8 a; s
                    if(data<=data[j])
    ; F% v) `3 ?0 V                {, R$ V7 i6 r0 t3 z( N  k  z
                            temp[k++]=data[i++];
    & |$ I4 ^1 F$ U9 `                }
    / f) V2 O9 f! |                else
    : D+ b  ]$ H. X5 @2 N) b4 V$ _                        temp[k++]=data[j++];0 Z( W( y5 ^* ^5 Q5 S- j
            }
    5 e8 g# A8 p7 {2 C9 ^, J. D7 r  ]+ b        while(i<=mid)//以下两个while代表可能出现的特殊情况:i/j所在数组已经全部完成排序,但另一数组仍有>=1的元素未放入临时数组中; n4 \( ^( `9 W, E
                    temp[k++]=data[i++];
    5 Z+ {2 i3 I- [/ l7 @        while(j<=right)) T. \/ Q0 o: Q0 \, C* f+ D5 f' _
                    temp[k++]=data[j++];
    - `0 _3 R3 o7 K- y0 f9 w6 d$ i$ s        for(i=0;i<k;i++)//将临时数组中的元素全部放入原数组中,k=right-left,k代表了数组长度: k3 ^& Y  q, k# p' B
                    data[left+i]=temp;1 z2 W" O7 M3 F8 g0 Q7 d
    }+ z: h4 v* p  Z3 {$ L7 L/ I. I
    void merge_array(float data[],int left,int mid,int right,float temp[])//哨兵简化  f% B6 E: R- i
    {! t. {0 p: b7 I$ S* T
            int max_num=INT_MAX;
    + L- g/ z: Q# W" u9 E" [" O        int len=right-left+1;
    $ h! \/ \, j; u/ N9 J7 m/ S        int data_left=new int [mid-left+2];
    7 E+ D& q" h. f+ K, f+ I/ j/ O0 o  ~        int data_right=new int [right-mid+1];
    / t, O0 J$ R  |. V0 ^7 J        int i=0,j=0,k=0;& T5 ]) w1 f* d: F+ [: U/ f
            for(int k=left;k<=mid;k++)! |' \  e% w5 Q* a9 I2 T) ~
                    data_left[k-left]=data[k];
    0 g5 |# }& t9 @. R4 i+ _5 @0 S. ]8 p        data_left[k-left]=max_num;1 w/ w/ Q) n$ p- J0 `4 E6 c
            for(int k=mid+i;k<=right;k++)
    & f5 I" e+ \0 g4 g  J5 s                data_right[k-mid-1]=data[k];
    ! n% f. N4 S' x) r, W+ ~5 a& {* q        data_right[k-mid-1]=max_num;
    - B. M' @+ t0 O# ]% V$ l        for(int k=0;k<len;k++)3 R% S/ z6 ^  ^  I+ {+ r
            {3 B2 _& x' p0 g: H# }
                    if(data_left<=data_right[j])* ~/ K8 s- [# Q3 W% }
                            data[k+left]=data_left[i++];
    0 [( i$ c# P8 S6 A# N( M3 w% g                else
    8 `/ w# k# m; f                        data[k+left]=data_right[j++];; w2 F$ \) W/ K& j# k+ m- t
            }; b0 u0 O0 u) I. F% |
    }' e3 i* S3 w% m+ f
    3 s1 C6 k& Z* X: T, ^: Z' n
    / D! z9 D1 p9 Y. W- v4 F
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    涂真锦        

    1

    主题

    2

    听众

    141

    积分

    升级  20.5%

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

    [LV.5]常住居民I

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

    回复

    使用道具 举报

    1178

    主题

    15

    听众

    1万

    积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    涂真锦 发表于 2021-11-29 17:54 3 D. g* o& i  P1 n. Z7 [0 z
    收藏,必须收藏啊
    # Q& J$ K( q) J, q; L# z/ b
    点赞
    ) w9 g' c" m; j! X- p0 n
    回复

    使用道具 举报

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

    fastpost qq
    收缩
    • 电话咨询

    • 04714969085

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-10-31 22:57 , Processed in 0.222191 second(s), 62 queries .

    回顶部