QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4503|回复: 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语言3 H6 O) H9 }/ T+ u" D3 M- ~

    直接插入排序法

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


    . `1 C; m7 ]6 X, j//插入排序法
    4 B9 O8 p' w1 M) [4 ~1 [# wvoid straightsort(int*arr,int len)
    6 ^! h& \' y5 i{) Z& A6 {2 S' f( h, b# E
            int temp,i,j;
      I* G! o; j. a. C- [9 @# O        for(i=1;i<len;i++)//将首元素看成有序数组,i=1表示从第二个元素开始排序$ r) n0 ~/ ^* M! h; M, |
            {! m' s, `8 b( J
                    temp=arr;//temp存放待插入元素1 ?' R; c/ [4 O: `. L: y
                    for(j=i-1;j>=0&&arr[j]>temp;j--)//待插入元素向左比较,arr[j]代表已经排序的有序数组,满足j>=0,且arr[j]>temp
    8 C2 o+ k* Y! m/ a' L% K                {
    6 f* e3 j! l( w& T5 |8 S                        arr[j+1]=arr[j];//若条件成立,则将已排序数组向右移位,arr[j]最大可达arr处,即temp处: b$ D/ ?/ ?0 T
                    }; \% o, c: N' c7 r
                    arr[j+1]=temp;//当循环不成立或循环终止,此时arr[j]<=temp(或j=-1,所有有序数组都大于待排元素,)temp应位于arr[j+1]处,j随temp左移而发生变化(减小)' n& N/ s" Z5 N" `
            }
    + }; z% U: e2 {% j}  Q* M. p6 g; O3 _- n8 b
    $ ?% t7 w1 M2 g6 [

    归并排序法

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

    % {0 d( P8 D4 U
    //归并排序法$ {' ~2 i5 A7 g4 H1 ]
    void merge_sort(float data[],int left,int right,float sorted_data[])$ \' P$ ^$ p- }
    {; _" y1 x% z5 A& w
            if(left<right)//排除原数组出现只有一个数据的情况(left=right)
    * b, }! f% J# u  O( w: @7 h        {/ Z) {% |- Y5 R( H$ d: V9 g4 Y
                    int mid=(left+right)/2;4 J6 c$ A  K/ n& {: U! C) D6 p
                    merge_sort(data,left,mid,sorted_data);
    9 o+ v7 P8 ^/ h$ R7 M4 v% N# K                merge_sort(data,min+1,right,sorted_data);' G& F! p8 \: x9 t* e
                    merge_array(data,left,mid,right,sorted_data);: z1 @& w7 k+ c" _3 \$ }6 Q) j
            }
    8 A1 d2 T! I( ~) l& [}
    8 P7 ^0 L  j2 y( I" zvoid merge_array(float data[],int left,int mid,int right,float temp[])//data[]即待排子数组,直接用子数组排序,但将子数组分为两部分,temp[]即临时数组! v! T( s: |, Q9 K1 ^
    {8 I2 v. R0 w6 {5 {
            int i=left,j=mid+1;% [# o' k) x5 o
            int k=0;& q8 c6 M2 d+ i( H! H- \
            while(i<=mid&&j<=right)//循环条件,将较小数组放入临时数组temp[]中,同时i变为data[i+1]或j变为data[j+1]
    ) U! a9 b9 k; e, I) J3 H: _        {" `7 C" m9 ]" C
                    if(data<=data[j])% r* Q9 _5 u" }! `" F1 |
                    {
      v4 d! G# g% }" D6 u5 d* c8 q                        temp[k++]=data[i++];' q! }, Y* F2 E5 R& a( z6 P9 A! o9 u  R
                    }
      B# P, \. a) N. P% t                else
    2 ?: B" n, h% t) G5 V# C; N$ V' C% x& o                        temp[k++]=data[j++];4 [$ C, J  k( p$ _5 P4 U3 }0 |
            }
    # b& F4 m) {: w/ o8 [" z  o        while(i<=mid)//以下两个while代表可能出现的特殊情况:i/j所在数组已经全部完成排序,但另一数组仍有>=1的元素未放入临时数组中
    9 U9 U# z1 W& b; M                temp[k++]=data[i++];* L! b2 T% |2 d% [& W
            while(j<=right)! e# q! w% C2 a2 |- I5 q
                    temp[k++]=data[j++];9 f% w6 V! t# Y4 O' q1 L/ K
            for(i=0;i<k;i++)//将临时数组中的元素全部放入原数组中,k=right-left,k代表了数组长度6 n1 @' ^# B5 j4 f
                    data[left+i]=temp;
    7 z# s) v! Q) V}
    2 C% O' X! l& A+ V5 i" Vvoid merge_array(float data[],int left,int mid,int right,float temp[])//哨兵简化
    " G& J# I7 i/ l0 d1 T. I- T& O# }{* R7 O# G1 s) S% ]
            int max_num=INT_MAX;
    8 }3 }/ K/ D" m        int len=right-left+1;) K  V" M+ U* `" I: ?
            int data_left=new int [mid-left+2];
    - [  Y. C% t1 x        int data_right=new int [right-mid+1];& T$ @  e( L. q4 ^" d+ |% P
            int i=0,j=0,k=0;
    ) X7 d1 J, K/ R: b4 J7 ^3 L        for(int k=left;k<=mid;k++)
    ! g# Z9 Q6 ?# ^; T9 g1 z" m                data_left[k-left]=data[k];# l. t) u' H0 I0 q& e
            data_left[k-left]=max_num;. g; \9 ?# @  z
            for(int k=mid+i;k<=right;k++)
      k; _8 Q# W$ g/ a$ `/ T                data_right[k-mid-1]=data[k];8 c, `" J4 C( X: f
            data_right[k-mid-1]=max_num;. L, c+ ?$ S- k9 U! m7 e5 a
            for(int k=0;k<len;k++)1 D; |, v; r# K2 x; V5 m
            {
    % {5 |  z9 R+ \; S; Q1 H# \0 D& a. T8 i                if(data_left<=data_right[j])
    2 v5 I$ U) c* o5 N( n0 l                        data[k+left]=data_left[i++];
    2 M) [; ~* u/ z3 D                else4 ]2 q  T- i" n0 o% l7 D
                            data[k+left]=data_right[j++];, i, W8 w5 s/ C5 J, f
            }
    % p9 W/ i# b/ C1 |3 T}* N9 X- p+ q# W- D4 ]! E

    6 }4 j4 ^% u9 a$ K# b& U& N1 q% t
    8 N5 X9 S! N  [7 a5 T( T+ a
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    涂真锦        

    1

    主题

    2

    听众

    141

    积分

    升级  20.5%

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

    [LV.5]常住居民I

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

    收藏,必须收藏啊0 T2 K; `: W* m7 ?; B$ X! z0 P. t- i

    点评

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

    使用道具 举报

    1178

    主题

    15

    听众

    1万

    积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    涂真锦 发表于 2021-11-29 17:54 ! O' v6 Q9 \5 E
    收藏,必须收藏啊

    * @) V" ], }4 H点赞6 T: q( `9 T9 G) c4 d* m
    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-10-23 04:35 , Processed in 0.862481 second(s), 66 queries .

    回顶部