QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2773|回复: 2
打印 上一主题 下一主题

无C不行-废物一个-算法导论:C语言

[复制链接]
字体大小: 正常 放大

1158

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-11-28 01:29 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
                                                无C不行,废物一个,算法导论:C语言
    % N8 w5 _  @3 W( q: }

    直接插入排序法

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


    * g6 s8 b; V0 y/ ^" c% d7 f2 W//插入排序法
    ; g. R8 O( w' Z. O5 O# `void straightsort(int*arr,int len)2 x2 e+ S1 @8 @$ F- _
    {
    / N8 Q' L3 r9 T, f        int temp,i,j;
    3 F2 \% O7 Z5 s, ^% C        for(i=1;i<len;i++)//将首元素看成有序数组,i=1表示从第二个元素开始排序( Z! j2 k9 l1 H$ u$ c
            {; Z4 x* Z; ^2 W/ E5 D
                    temp=arr;//temp存放待插入元素- S! X/ [) }& n1 N. @- C
                    for(j=i-1;j>=0&&arr[j]>temp;j--)//待插入元素向左比较,arr[j]代表已经排序的有序数组,满足j>=0,且arr[j]>temp" l* Y( y, O: A2 u4 r, e
                    {; `) x! ~+ k( I1 {2 z# @7 x
                            arr[j+1]=arr[j];//若条件成立,则将已排序数组向右移位,arr[j]最大可达arr处,即temp处  t3 d$ t# d" D, o& s
                    }
    / E  U* R* B* f# }2 T  Z                arr[j+1]=temp;//当循环不成立或循环终止,此时arr[j]<=temp(或j=-1,所有有序数组都大于待排元素,)temp应位于arr[j+1]处,j随temp左移而发生变化(减小)8 p5 v3 U0 `; V4 F# K3 K
            }0 o9 H! @# c: T7 t
    }, \- b/ o+ G1 I3 e" S: [
    9 L/ c! x2 R, s8 S+ v

    归并排序法

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


    4 Z/ }# ]6 ], h//归并排序法
    : M9 ?: ?. P" y* b1 M3 zvoid merge_sort(float data[],int left,int right,float sorted_data[])6 m+ L. Q" w/ `0 n( c# d
    {) A9 @9 u. W, h' L5 N' Q
            if(left<right)//排除原数组出现只有一个数据的情况(left=right)
    ) @7 X" f5 V& M" s        {% y/ L8 |) u& L1 ?  X
                    int mid=(left+right)/2;
    2 T3 ~- m* `/ N' c$ i) E                merge_sort(data,left,mid,sorted_data);
    / F; Q& d  @7 h; k  h% E                merge_sort(data,min+1,right,sorted_data);
    $ A& N2 M& \5 L2 |- L8 i# u                merge_array(data,left,mid,right,sorted_data);6 \8 E0 [) m7 Y6 H
            }
    / W' x6 j8 f4 ~/ s# r}
    & x3 {6 [3 u. B) xvoid merge_array(float data[],int left,int mid,int right,float temp[])//data[]即待排子数组,直接用子数组排序,但将子数组分为两部分,temp[]即临时数组
    + |( O) h& M" |( X' p# B2 T3 D{
    0 v. J- p9 \. Y! T& M        int i=left,j=mid+1;
      N, X$ [- ^/ x6 u; Q' B        int k=0;
      s+ V. o1 h, B* f: n4 S        while(i<=mid&&j<=right)//循环条件,将较小数组放入临时数组temp[]中,同时i变为data[i+1]或j变为data[j+1]
    - W# I- H$ ^  b2 g        {, F: g* ?! u. B, ^: O1 O  o
                    if(data<=data[j])
    / I0 z7 x, B3 h# k. U9 a6 `                {# y( g/ i2 t; m* Q
                            temp[k++]=data[i++];
    ; }; r6 _5 k  c: H- `$ L                }7 e  U+ a5 [. J' i
                    else' [# I4 W2 f! E* j5 U) c7 E
                            temp[k++]=data[j++];
    " f" g6 a) y3 Q% @/ O: Y: r        }, C7 q% o( ~& ~; z( W" ~
            while(i<=mid)//以下两个while代表可能出现的特殊情况:i/j所在数组已经全部完成排序,但另一数组仍有>=1的元素未放入临时数组中
    & _6 W+ l7 k+ K* ]4 S  U1 N2 t1 U                temp[k++]=data[i++];
    7 g9 k! H5 }6 m: L        while(j<=right)
    7 t; m6 V7 Y2 D& _. [                temp[k++]=data[j++];; M. u# K2 N# W1 Y
            for(i=0;i<k;i++)//将临时数组中的元素全部放入原数组中,k=right-left,k代表了数组长度
    * [0 k  G3 z6 U                data[left+i]=temp;. D. U1 ~; h+ x  F4 x& I) z0 O  j
    }+ W( z- K+ T* N/ a+ c
    void merge_array(float data[],int left,int mid,int right,float temp[])//哨兵简化
    ' `) r, u( y. v; y- F0 H{" }! a  V- N3 U
            int max_num=INT_MAX;
    ! u/ h& |! W' Y. Z        int len=right-left+1;
    ! I; |5 T  A# n3 |7 }# R        int data_left=new int [mid-left+2];3 \4 X* q0 t8 h
            int data_right=new int [right-mid+1];
    + E" R4 R+ u4 h" m/ \) `        int i=0,j=0,k=0;! |1 a4 I6 k7 E' g/ q" F7 V- T
            for(int k=left;k<=mid;k++)
    + l4 Y; V2 S! R3 i: t5 a0 \                data_left[k-left]=data[k];- R8 [/ s" H% ^/ {! C& I
            data_left[k-left]=max_num;# \; x1 \; Y4 h& P* G% T# H
            for(int k=mid+i;k<=right;k++). s3 `7 y3 P3 _! Y
                    data_right[k-mid-1]=data[k];
      Z& j# ]! W  K# g        data_right[k-mid-1]=max_num;0 n* V( o& C+ p( U
            for(int k=0;k<len;k++)) b5 p8 B( y* S; Q8 C" E, Y3 ]
            {5 {8 Q" J' \  \1 {2 \& m8 P
                    if(data_left<=data_right[j])( ?6 k4 G% Z9 O. O1 q
                            data[k+left]=data_left[i++];
    ' ^! @( A  o3 w# |4 p                else
    , L7 a5 [: _1 {6 y8 z; t" S                        data[k+left]=data_right[j++];" U6 ]8 L6 l; k3 p. |
            }* W+ p: p. ^3 K$ ]  r* f/ q
    }) L+ Y, o  V( }8 f& |4 B. l

    * f" l' g0 ]( J( M2 {
    3 n1 S& S/ N- L' W- B  @: w
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    涂真锦        

    1

    主题

    2

    听众

    141

    积分

    升级  20.5%

  • TA的每日心情

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

    [LV.5]常住居民I

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

    收藏,必须收藏啊! C8 r, }! d0 @* O

    点评

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

    使用道具 举报

    1158

    主题

    15

    听众

    1万

    积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    涂真锦 发表于 2021-11-29 17:54
    9 Q9 W( x2 b6 \! D收藏,必须收藏啊
    + k9 K3 \5 R" @" @8 l+ k* |4 r/ e5 v- Z
    点赞
    3 E* J# E, x5 D5 i  g' ~7 i4 f
    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2024-4-28 05:19 , Processed in 0.314688 second(s), 62 queries .

    回顶部