QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4309|回复: 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 V3 s% }/ n2 ^: ~

    直接插入排序法

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


    : ~- H" }, H0 d; s6 w//插入排序法5 b( i) V9 g, k# {% k1 N
    void straightsort(int*arr,int len)
    ) o5 j6 v' u! i& D/ t( Z9 g4 j! W{/ G# o+ ]1 c! E1 I
            int temp,i,j;" [8 C# R6 X# O9 P. N
            for(i=1;i<len;i++)//将首元素看成有序数组,i=1表示从第二个元素开始排序( Y, W1 `$ I! i, l7 a$ R
            {
    8 ^6 A8 h7 \" `                temp=arr;//temp存放待插入元素
    6 ~0 g3 \5 ]9 S; V0 a8 Y0 Y                for(j=i-1;j>=0&&arr[j]>temp;j--)//待插入元素向左比较,arr[j]代表已经排序的有序数组,满足j>=0,且arr[j]>temp
    9 E( Y, T% s. l7 s! c0 g: v                {9 n  D- N9 B3 N
                            arr[j+1]=arr[j];//若条件成立,则将已排序数组向右移位,arr[j]最大可达arr处,即temp处( O( i" ~; ^2 j, a3 W
                    }
      p4 c0 f% S2 i+ f; X8 h% _                arr[j+1]=temp;//当循环不成立或循环终止,此时arr[j]<=temp(或j=-1,所有有序数组都大于待排元素,)temp应位于arr[j+1]处,j随temp左移而发生变化(减小)$ S% i7 T& i9 f) r; ~' D
            }: K: C7 z* {6 ]( [; s  V2 z- J
    }9 G& C0 K1 a7 D* Y4 Z$ ^- O

    : ~9 [6 i$ S# X" E: g

    归并排序法

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


    9 T+ }2 v; X# E! K. \  C$ U//归并排序法
    , [) b/ d0 m; r2 Pvoid merge_sort(float data[],int left,int right,float sorted_data[])
    * F  b. h9 t8 V1 D, a+ R{
    4 i$ W& a' M4 s* Y. G3 }6 E        if(left<right)//排除原数组出现只有一个数据的情况(left=right)
    4 s) t" C0 `/ |  o. h5 i        {
    # m; H: ~6 j4 p6 X                int mid=(left+right)/2;
    / D8 C$ J0 _. b2 H* b4 p1 c/ E$ L                merge_sort(data,left,mid,sorted_data);6 z" z2 n+ w1 l. }
                    merge_sort(data,min+1,right,sorted_data);. @2 Y! X7 K/ A/ H( t
                    merge_array(data,left,mid,right,sorted_data);
    4 G) X+ i; T2 ^  @/ w        }
    6 N, q, _& M4 l% s3 l2 K}
    ! l* i, }, t3 Z/ l9 g/ {void merge_array(float data[],int left,int mid,int right,float temp[])//data[]即待排子数组,直接用子数组排序,但将子数组分为两部分,temp[]即临时数组
      D! e3 u8 L% Y. {# ?1 \0 S5 m* I{
    % R% |- a/ w# F2 c# q        int i=left,j=mid+1;
    + l1 i; w, O7 o5 G        int k=0;" R% e0 b7 s/ c+ S; t- }
            while(i<=mid&&j<=right)//循环条件,将较小数组放入临时数组temp[]中,同时i变为data[i+1]或j变为data[j+1]
    - |' w0 l3 _6 K, d4 ]        {) N" g4 Z1 P, H$ }0 I
                    if(data<=data[j])
    0 M6 f( n9 M2 H( ^/ ^                {, t/ ?% |) W2 q$ P
                            temp[k++]=data[i++];& \6 D* ?% \: p- u, b
                    }* x( S$ u- D$ A3 p7 h. d' _
                    else+ J& j) V4 p: L" S
                            temp[k++]=data[j++];' w3 t) o9 B  v0 D( n
            }# r0 f( j' g: N/ A- O- b
            while(i<=mid)//以下两个while代表可能出现的特殊情况:i/j所在数组已经全部完成排序,但另一数组仍有>=1的元素未放入临时数组中7 I3 C9 Y" L8 J8 }2 T; K0 s
                    temp[k++]=data[i++];
    ' b# x# |+ o" T! k        while(j<=right); u' l/ S0 L. R8 T
                    temp[k++]=data[j++];
    . ~0 g6 O& E$ p  Q, j  n7 E5 C' I( Z        for(i=0;i<k;i++)//将临时数组中的元素全部放入原数组中,k=right-left,k代表了数组长度2 y7 M1 t$ {; o6 T/ D
                    data[left+i]=temp;3 M" s/ _" {4 \* w7 w
    }
    " ~% f$ k' v- T7 s4 ^/ vvoid merge_array(float data[],int left,int mid,int right,float temp[])//哨兵简化; H9 N" o6 L  P; C" k) h
    {8 ?- r  M! U0 p" r! K
            int max_num=INT_MAX;" D( e. C! \6 e( p, L0 w9 t7 Z
            int len=right-left+1;& e  Z" E/ z) P0 G2 g
            int data_left=new int [mid-left+2];0 n& e: S1 l1 n& H& p: x6 |
            int data_right=new int [right-mid+1];
    2 q2 L) H6 q" w! j* d        int i=0,j=0,k=0;
    6 z: G4 l- C5 \5 ~5 j3 V# _: A' M  W        for(int k=left;k<=mid;k++)
    / Y/ B+ }: C6 f$ Y1 Z                data_left[k-left]=data[k];7 Z: `+ [" j' Q6 \: ~* T' u
            data_left[k-left]=max_num;; U8 e- H6 {/ L# Q$ e  K9 u
            for(int k=mid+i;k<=right;k++)
    ( `% V; ^/ Z8 @) _                data_right[k-mid-1]=data[k];
    6 Y4 O$ S  J2 }7 `        data_right[k-mid-1]=max_num;0 I' t( E8 {, j- G4 v/ ?; P
            for(int k=0;k<len;k++)4 B, k1 g, S) s: y' G$ [
            {
      W6 b+ _4 z, S* V/ }7 L# j                if(data_left<=data_right[j])
    : G  z7 ^' f& t                        data[k+left]=data_left[i++];% o0 D- e7 l$ L% K. u
                    else7 G1 K, v+ h% O9 B! H5 P* i
                            data[k+left]=data_right[j++];5 \2 h% N  H2 a3 V$ F/ e* @( Y! j+ O
            }* O4 i# f  A5 e0 @
    }
    ' h1 J& I) }: i8 [
    . a5 ?8 x! y+ D( a! z. s+ _* v8 Y' t/ b; p. H8 N% E
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    涂真锦        

    1

    主题

    2

    听众

    141

    积分

    升级  20.5%

  • TA的每日心情

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

    [LV.5]常住居民I

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

    收藏,必须收藏啊# v; }/ m( B; x( M+ c. k+ t) {

    点评

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

    使用道具 举报

    1178

    主题

    15

    听众

    1万

    积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    涂真锦 发表于 2021-11-29 17:54
    , d3 e' e( h$ ^( ^  @! H( K! |收藏,必须收藏啊

    , I. ^" p% Q, k! i/ j+ v0 L点赞* R% ^6 p4 c% s: ~
    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-7-20 07:13 , Processed in 1.687384 second(s), 68 queries .

    回顶部