QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4509|回复: 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语言- |( {4 l' `9 T' K2 W) d4 H' M

    直接插入排序法

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


    + c- b, Q' ^5 i. t! L7 j//插入排序法- [$ G0 k9 B' ?  d: ?+ W+ k$ Z
    void straightsort(int*arr,int len)* b: Y  E# Y& K  Y7 u) w* V
    {
    8 l/ s' m; x0 D8 v+ G        int temp,i,j;- n( [$ p$ ^, |; R
            for(i=1;i<len;i++)//将首元素看成有序数组,i=1表示从第二个元素开始排序$ o6 K2 d. U. }5 H5 e1 c  ]: R
            {7 B+ X! f$ A& E  ~; p; W: _
                    temp=arr;//temp存放待插入元素5 R( C$ a% O6 i( I' _* ^. B
                    for(j=i-1;j>=0&&arr[j]>temp;j--)//待插入元素向左比较,arr[j]代表已经排序的有序数组,满足j>=0,且arr[j]>temp
    / ?7 v& {3 g# L! j3 |; |9 i& P# y                {
    ' _- E3 E: I5 ^4 m                        arr[j+1]=arr[j];//若条件成立,则将已排序数组向右移位,arr[j]最大可达arr处,即temp处$ t. {! E& H: {+ p
                    }" K* K: k( I* x
                    arr[j+1]=temp;//当循环不成立或循环终止,此时arr[j]<=temp(或j=-1,所有有序数组都大于待排元素,)temp应位于arr[j+1]处,j随temp左移而发生变化(减小)& k: x+ Y( U  R. t- Q6 t3 w
            }
    2 \1 \5 j. P$ Y3 y  j}
    / [3 h1 G, c* v5 f- I, i& S! r" R2 P

    归并排序法

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


    4 _7 U' R5 K' s4 ]9 V//归并排序法3 n1 B, f- s0 k, G: T! `
    void merge_sort(float data[],int left,int right,float sorted_data[])
    0 a( p, r& [1 W8 I- H. p( j{) P' U/ P; m+ W$ o) @7 r2 p
            if(left<right)//排除原数组出现只有一个数据的情况(left=right)
    8 W" y' e# [! M        {8 F0 b9 J3 }: m! z4 Z) K
                    int mid=(left+right)/2;
    3 [' k. B& [9 g! h. G                merge_sort(data,left,mid,sorted_data);2 p/ v/ z$ {* I; o) _, t
                    merge_sort(data,min+1,right,sorted_data);/ x! U, Y  z: r0 q# ], m
                    merge_array(data,left,mid,right,sorted_data);
    # j% ?+ I: y& y        }
    ! V- B" \$ C8 s# f8 O}
    . O* `- a1 M& Nvoid merge_array(float data[],int left,int mid,int right,float temp[])//data[]即待排子数组,直接用子数组排序,但将子数组分为两部分,temp[]即临时数组
    * D& u! V& t4 X2 e& D{
    ! A' Q  m8 ]4 S& K6 ?        int i=left,j=mid+1;1 Q- P2 ?, K; X/ ]) P! f% Q5 d# V8 P
            int k=0;
    1 }# P( @' w9 R3 ]; G5 e6 g- S        while(i<=mid&&j<=right)//循环条件,将较小数组放入临时数组temp[]中,同时i变为data[i+1]或j变为data[j+1]2 b6 R' O' }0 y- ~
            {! W6 ^, n5 D/ D' q7 J2 \
                    if(data<=data[j])
    $ _( ]$ H$ h1 \                {$ e4 `, |- Q4 i; r
                            temp[k++]=data[i++];1 e; q, x3 t0 t% m. J
                    }
    , _: C4 [% y- ~5 y+ x9 y                else& Y" N7 r$ h% d
                            temp[k++]=data[j++];! }! B! |- |4 }0 l
            }
      F3 i* W1 L/ ?( o: e        while(i<=mid)//以下两个while代表可能出现的特殊情况:i/j所在数组已经全部完成排序,但另一数组仍有>=1的元素未放入临时数组中6 Z* x, @" A  ?
                    temp[k++]=data[i++];
    ( B6 F" |+ u& t& l  j        while(j<=right)
    % z  c  J" s) t+ n                temp[k++]=data[j++];& b' F0 a- r2 r5 m+ T* B7 M. i3 R
            for(i=0;i<k;i++)//将临时数组中的元素全部放入原数组中,k=right-left,k代表了数组长度
    ! {; a6 A+ w5 S+ m; a6 }6 A) u/ m                data[left+i]=temp;
    ( R& l7 B/ M; e% m}" L/ Y* N; K- _+ ]9 [8 w
    void merge_array(float data[],int left,int mid,int right,float temp[])//哨兵简化
    : ]) y( D! j- Q' J* Q  E{5 Y3 Q: Y$ O+ L3 c
            int max_num=INT_MAX;
    " T: {) {7 ~: g8 F        int len=right-left+1;( {' Z* Z2 j, J) J4 U& J5 }% s
            int data_left=new int [mid-left+2];
    ' V$ O5 w/ b4 f5 v) ?        int data_right=new int [right-mid+1];) ^/ T, F% C& d2 u
            int i=0,j=0,k=0;
    9 i' N, g! T6 k8 |8 _1 @        for(int k=left;k<=mid;k++)) S5 e* j# k/ R3 N1 u* {) @: p
                    data_left[k-left]=data[k];; |/ w) ~3 Q- e1 d; J( E
            data_left[k-left]=max_num;7 K/ i) ?! \: }5 v$ b: S/ i7 O
            for(int k=mid+i;k<=right;k++)
    ! h& e* F( D8 R$ x6 h9 T                data_right[k-mid-1]=data[k];7 h0 a$ z5 |- [; L
            data_right[k-mid-1]=max_num;8 D9 D; ~: u& Z* P; s' z) W- O6 k
            for(int k=0;k<len;k++)0 v8 N" `9 I% N
            {; p0 T# l" o& x# W! N1 l0 K
                    if(data_left<=data_right[j])  @' R, d4 Y% {. L  o/ e8 A
                            data[k+left]=data_left[i++];
    4 i( A" ]1 M7 n                else
    1 a- j4 P" W8 ]3 |                        data[k+left]=data_right[j++];1 T' @) ?/ k) E+ u5 p  e) e: p
            }1 l8 z: \+ f( a3 c
    }
    1 G( l' R/ N& j6 f2 W  D% q# {' f4 S$ j: L4 Q  H* g2 \+ _

      T" D4 D5 y% d7 Z- g$ h4 K3 @
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    涂真锦        

    1

    主题

    2

    听众

    141

    积分

    升级  20.5%

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

    [LV.5]常住居民I

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

    收藏,必须收藏啊3 Y7 b! Z, Q& y8 M0 N. p/ f

    点评

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

    使用道具 举报

    1178

    主题

    15

    听众

    1万

    积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    涂真锦 发表于 2021-11-29 17:54
    ! m2 D5 q3 h* D: T6 J: O* J收藏,必须收藏啊
    % V$ @3 F+ L# W' B2 S" ~, _
    点赞
    8 b3 D8 a3 u* d/ T, r! v( `$ e- M
    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-10-24 04:12 , Processed in 1.402653 second(s), 62 queries .

    回顶部