QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3615|回复: 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语言
    ' R( _& s6 r0 c* x4 ~' S6 n7 B8 V

    直接插入排序法

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

    ; V% L4 z" O7 q9 x
    //插入排序法
    . R4 X( I2 X: F9 p! P" a( d/ Mvoid straightsort(int*arr,int len)
    ( Y/ ~4 V+ V3 V' a( g! |+ u0 ~{
    : o1 S8 R4 t# o4 q  q2 |        int temp,i,j;% ]5 D8 P5 G7 J9 L( W! N! S
            for(i=1;i<len;i++)//将首元素看成有序数组,i=1表示从第二个元素开始排序0 X  C3 v+ _: F/ I  m2 ]* @
            {
    4 O# c- S; B: `4 J, B                temp=arr;//temp存放待插入元素" h+ v5 P7 x# p; t2 A0 r5 C4 q
                    for(j=i-1;j>=0&&arr[j]>temp;j--)//待插入元素向左比较,arr[j]代表已经排序的有序数组,满足j>=0,且arr[j]>temp' A0 [5 w% L1 }3 `" _4 \
                    {
    $ W0 Q* K( {5 ]/ p8 e  O1 Q- o2 F                        arr[j+1]=arr[j];//若条件成立,则将已排序数组向右移位,arr[j]最大可达arr处,即temp处' u' X! R$ P7 v8 M6 I  l
                    }5 X% E* `8 x3 D9 h8 \3 |/ @- g
                    arr[j+1]=temp;//当循环不成立或循环终止,此时arr[j]<=temp(或j=-1,所有有序数组都大于待排元素,)temp应位于arr[j+1]处,j随temp左移而发生变化(减小)9 Q9 V6 g" W5 N/ T2 S+ J
            }2 @3 h( e- D( M9 Y9 C& W
    }0 m8 i, l  M9 b* C: D; S4 F
    7 u. ^: G! _4 G9 l, n1 ^

    归并排序法

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

    4 R+ Z: Z' d$ E9 N6 h
    //归并排序法
    , }0 L0 z0 r9 b# h4 i! q6 |9 Cvoid merge_sort(float data[],int left,int right,float sorted_data[])! j( k' B9 W% I% V* w2 k) K
    {3 }# M) ~. k; f4 t& n) X0 g
            if(left<right)//排除原数组出现只有一个数据的情况(left=right)9 q: P! G2 U" N) M4 a7 \- g( J
            {
    # b+ ~. S& z4 |+ G                int mid=(left+right)/2;
    * C. C5 [& ^# ]; }                merge_sort(data,left,mid,sorted_data);4 W5 \) \- V3 o) r
                    merge_sort(data,min+1,right,sorted_data);
    - }. C1 |  o' t, a8 G                merge_array(data,left,mid,right,sorted_data);
    . i6 x" ~' S' s        }) k2 K& k0 \, H4 V4 S
    }' w# d4 e- ?* V, D3 }
    void merge_array(float data[],int left,int mid,int right,float temp[])//data[]即待排子数组,直接用子数组排序,但将子数组分为两部分,temp[]即临时数组& G1 o( a# W! k% \) ~
    {- M: v5 y& V. S) Q0 a, z9 ^# ~. c8 W, V
            int i=left,j=mid+1;2 f: `6 Q* V: {9 q# R: o  @
            int k=0;
    8 N. U% S2 L6 D* A- d) X3 c        while(i<=mid&&j<=right)//循环条件,将较小数组放入临时数组temp[]中,同时i变为data[i+1]或j变为data[j+1]
    . y6 ^5 Z6 W+ S9 Q& T9 _        {
    4 A0 \0 h3 q( \5 u. Y+ w) a                if(data<=data[j])0 q' ^: a6 n/ l8 F
                    {
    $ E: n# Z* _. ]                        temp[k++]=data[i++];0 O4 d+ K6 s( k. ~) t
                    }5 D+ [# O: n" `
                    else" H0 O/ e$ }3 P0 N
                            temp[k++]=data[j++];! `3 M/ \) F/ X# k, ?) S0 `
            }
    5 D9 L! H* h  _. L+ ]" o  _1 b        while(i<=mid)//以下两个while代表可能出现的特殊情况:i/j所在数组已经全部完成排序,但另一数组仍有>=1的元素未放入临时数组中
    + \) K9 v7 e  M. q* F" R2 ~3 w                temp[k++]=data[i++];/ w; N: z$ }/ k* \+ Q0 [) ]
            while(j<=right)
    7 e) D( B* B- J, Q5 m% F" x                temp[k++]=data[j++];
    ) i7 p- X7 E  E+ ]; m        for(i=0;i<k;i++)//将临时数组中的元素全部放入原数组中,k=right-left,k代表了数组长度
    + F( ^" W4 T( `- X                data[left+i]=temp;% r" E1 q+ v3 t9 t3 \3 q/ J7 b
    }, @9 P* U) f2 g! ~
    void merge_array(float data[],int left,int mid,int right,float temp[])//哨兵简化
    + h* x, @' n5 @- R{4 c" k  |: O3 r8 [8 _4 e% g
            int max_num=INT_MAX;
    & f% S1 b2 n7 W' v& W9 Q' [, D: v        int len=right-left+1;2 K; ^2 c2 z9 i! Q
            int data_left=new int [mid-left+2];3 H4 e, O; {& J+ T8 G
            int data_right=new int [right-mid+1];, p: p+ g0 X( @6 q7 q( q6 C/ `
            int i=0,j=0,k=0;
    4 q, ^1 d9 E) m7 O. J. z        for(int k=left;k<=mid;k++)& }+ v2 S2 ]4 p! {
                    data_left[k-left]=data[k];7 R7 |1 w, {9 ^9 [3 v' v( n! {
            data_left[k-left]=max_num;
    1 Z0 ?: f4 a7 n9 q3 c        for(int k=mid+i;k<=right;k++): ~. [# A; v6 O
                    data_right[k-mid-1]=data[k];: g4 A5 s. \7 e
            data_right[k-mid-1]=max_num;
    ) f9 B. I3 v! b! n, I        for(int k=0;k<len;k++)/ l; J$ h: ^1 z) C% `
            {
    , H+ k3 v) D$ n' Z, P4 D+ i                if(data_left<=data_right[j])
    / {' U# T5 w+ m' ]                        data[k+left]=data_left[i++];
    , x; o7 L* N0 K9 g9 L                else
    ; p" l3 R% \( r" x7 P" i                        data[k+left]=data_right[j++];) Q+ E: }4 B( Z
            }
    ! [! W9 A/ y+ e' K' B7 _}
    5 z. `- y/ ?8 I3 R3 o. z
    ; ~! b( d3 V( r) a6 \& X) W5 C0 Z0 h: u( Z3 e- i
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    涂真锦        

    1

    主题

    2

    听众

    141

    积分

    升级  20.5%

  • TA的每日心情

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

    [LV.5]常住居民I

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

    收藏,必须收藏啊
    ' i+ V6 E; ?% x5 s

    点评

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

    使用道具 举报

    1178

    主题

    15

    听众

    1万

    积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    涂真锦 发表于 2021-11-29 17:54 $ L# M8 U$ O5 E2 [* B8 U
    收藏,必须收藏啊

    0 w6 |  J  }+ j( p" r5 k点赞
    * o4 t. f4 v% f/ D% b: G
    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2025-5-11 00:38 , Processed in 0.580158 second(s), 62 queries .

    回顶部