QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4558|回复: 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语言5 a: H$ E: ?5 p0 e3 A

    直接插入排序法

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

    . p+ k3 r+ q# z8 k4 D% P- O5 j8 r
    //插入排序法
    $ R( o6 n  C) m) e7 `+ I& a8 y/ fvoid straightsort(int*arr,int len): {, L4 J# V/ _1 D3 _, V% u/ m
    {
    7 }  Z* }1 O2 V5 O7 l0 |2 T. j% y        int temp,i,j;, u; K! s: @, l' d
            for(i=1;i<len;i++)//将首元素看成有序数组,i=1表示从第二个元素开始排序
    + R) A. g' w7 R6 B9 ]        {/ ]" d- V" X5 G9 X& l
                    temp=arr;//temp存放待插入元素/ \6 [  c! S# s; @, K5 p  J2 M
                    for(j=i-1;j>=0&&arr[j]>temp;j--)//待插入元素向左比较,arr[j]代表已经排序的有序数组,满足j>=0,且arr[j]>temp
    4 J! R0 t5 x- t, E7 K0 Y$ l) p8 j                {# u1 u# B* W9 G' x
                            arr[j+1]=arr[j];//若条件成立,则将已排序数组向右移位,arr[j]最大可达arr处,即temp处
    * p- ]% L1 U- U0 M- e                }
    ( }5 G- ?$ A3 a* Y                arr[j+1]=temp;//当循环不成立或循环终止,此时arr[j]<=temp(或j=-1,所有有序数组都大于待排元素,)temp应位于arr[j+1]处,j随temp左移而发生变化(减小)
    0 \3 Q$ B2 K) ~2 j* s9 T* U' E% W        }$ }# d# b. D- h& X6 ~
    }# V( E" q% H5 Y$ v1 Y

    / O; U& D& J/ _$ @( m; e

    归并排序法

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

    ) @. c7 n5 |: O+ _
    //归并排序法( T8 O. Y/ I( ]( L8 k
    void merge_sort(float data[],int left,int right,float sorted_data[])
    8 }4 X; F$ G+ P5 j& m$ B8 V4 Y' o* \{
    # j9 o8 s4 K; j' O, o        if(left<right)//排除原数组出现只有一个数据的情况(left=right)/ M8 Y0 T2 i, ]5 M
            {0 B1 x2 \. @! v& p
                    int mid=(left+right)/2;# p  Y. v9 I* C+ Q9 v
                    merge_sort(data,left,mid,sorted_data);' X$ f* m( M3 P
                    merge_sort(data,min+1,right,sorted_data);! c" [  J/ R& |( }/ t! ?
                    merge_array(data,left,mid,right,sorted_data);
    ) w. u/ @3 X9 S' o0 \1 Y: G        }7 D' C: T* C6 N  w3 u
    }: b! ?" i2 g1 O! {5 C# a: L
    void merge_array(float data[],int left,int mid,int right,float temp[])//data[]即待排子数组,直接用子数组排序,但将子数组分为两部分,temp[]即临时数组" C2 D. M! |/ f& z5 m3 ~' j- @
    {3 k5 e6 J" D; p& X/ n
            int i=left,j=mid+1;3 Q8 R* G  G8 L! _4 ^
            int k=0;
    * }: E" q5 P, }1 B% ~        while(i<=mid&&j<=right)//循环条件,将较小数组放入临时数组temp[]中,同时i变为data[i+1]或j变为data[j+1]7 u" d6 B4 B1 ]) o  ^) ]
            {
    1 a9 j( r( y' X' T: F8 K, _                if(data<=data[j])
    7 `- m3 a9 I9 G* D                {
    ) n' r9 {' K1 x* d* Y$ q' h  n5 s                        temp[k++]=data[i++];
      Z4 D/ n& o% g( J3 Q                }; ^! M0 e' M0 h* l) h
                    else6 F/ n5 h( S6 o5 q4 Y
                            temp[k++]=data[j++];2 F7 X% X( Y  T: I5 b
            }
    2 ?# g# k/ B. u' R4 [        while(i<=mid)//以下两个while代表可能出现的特殊情况:i/j所在数组已经全部完成排序,但另一数组仍有>=1的元素未放入临时数组中2 g" k' `4 \( y6 z# r+ g7 W6 g. f
                    temp[k++]=data[i++];
    " i! Q  e! j! h, c0 l        while(j<=right)
    5 J! t, m, ?2 A6 g                temp[k++]=data[j++];( `9 Q& p: y) |8 r" V6 x5 Q; f
            for(i=0;i<k;i++)//将临时数组中的元素全部放入原数组中,k=right-left,k代表了数组长度9 o9 |8 K0 ]9 o% \- o# s& A
                    data[left+i]=temp;2 w& H0 \# {# O2 W/ w! E
    }# w% S* ^9 u+ h8 G/ A) A" S: C7 [
    void merge_array(float data[],int left,int mid,int right,float temp[])//哨兵简化  |! ~; J# ?! C5 L( _+ ^8 q
    {" o  _4 S/ C9 N7 _/ [& Y( Z
            int max_num=INT_MAX;! _  n7 h" w4 T! C( E3 f
            int len=right-left+1;
    2 S- G! S; k4 W: z# ]- P5 Q# C: k        int data_left=new int [mid-left+2];. r0 Z; L  h# Q
            int data_right=new int [right-mid+1];
    : N  v3 E4 h( w1 Z" |" K1 n        int i=0,j=0,k=0;
    ' A; n' g$ r$ o! b/ R* }        for(int k=left;k<=mid;k++)
    1 [  A- y* x2 E5 a3 Y                data_left[k-left]=data[k];
    " v( P9 ]! O6 u4 \: E        data_left[k-left]=max_num;
    - r% ^  I3 u5 x- Q) s0 s        for(int k=mid+i;k<=right;k++)- y, l5 c+ v$ B  Y2 N
                    data_right[k-mid-1]=data[k];! E  z/ Y, ?5 {5 f1 ?5 b
            data_right[k-mid-1]=max_num;
    ! y+ Q; Q" V/ {3 s( [        for(int k=0;k<len;k++)
    # y" }& r: H4 U8 p4 u# z$ l9 f        {- I/ N6 }' K7 Z- L8 ]
                    if(data_left<=data_right[j])+ E) k, Q* P$ V4 y
                            data[k+left]=data_left[i++];
    # h8 [3 |/ [3 j, P9 a' y- R                else
    ' M3 s' _( k2 C6 C6 p- u                        data[k+left]=data_right[j++];
    % e) k, a0 N- ]; b0 ^3 q; a        }
    & J" @2 F  p$ J- A}0 [  I& ?1 Y' |- b# I) X
    ! l" e9 b2 L  G: ^

    2 X9 X& Z6 v. ]2 h4 \7 C
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    涂真锦        

    1

    主题

    2

    听众

    141

    积分

    升级  20.5%

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

    [LV.5]常住居民I

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

    收藏,必须收藏啊, b! |. ^: E9 H5 w

    点评

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

    使用道具 举报

    1178

    主题

    15

    听众

    1万

    积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    涂真锦 发表于 2021-11-29 17:54 6 w) e1 h/ J) g( P$ }8 x# s
    收藏,必须收藏啊

    7 L& G6 }5 s, `$ O& }点赞! o* `9 Y5 B: s1 z: ~7 m4 ]$ p
    回复

    使用道具 举报

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

    fastpost qq
    收缩
    • 电话咨询

    • 04714969085

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-11-1 12:41 , Processed in 0.321661 second(s), 62 queries .

    回顶部