QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4226|回复: 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 M! }. z+ d! R* ]

    直接插入排序法

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

    / s- v! R7 m3 t; a! Q, D
    //插入排序法9 n: I2 {* s! m, w: r: S* L
    void straightsort(int*arr,int len)+ Y8 B4 B# @/ C% Q/ H
    {5 X6 f; x1 R5 J; y5 j+ [7 V* s# Z
            int temp,i,j;
    ) G% _& `( L+ C( J        for(i=1;i<len;i++)//将首元素看成有序数组,i=1表示从第二个元素开始排序
    0 h# ^/ B6 ~7 r& Q3 @: Q7 L        {
      S- _4 f% K) r9 h                temp=arr;//temp存放待插入元素
    3 H1 d5 U) J( o2 d8 x( W                for(j=i-1;j>=0&&arr[j]>temp;j--)//待插入元素向左比较,arr[j]代表已经排序的有序数组,满足j>=0,且arr[j]>temp
    ' k' E4 N. E. C  c- x& z2 d# X                {; x, e0 ]8 T3 s: V( M2 q/ s
                            arr[j+1]=arr[j];//若条件成立,则将已排序数组向右移位,arr[j]最大可达arr处,即temp处
    - e0 P% H" ~! R3 }  S) h                }1 O' j9 J- s, n
                    arr[j+1]=temp;//当循环不成立或循环终止,此时arr[j]<=temp(或j=-1,所有有序数组都大于待排元素,)temp应位于arr[j+1]处,j随temp左移而发生变化(减小)
    ( X4 V5 Q' W6 r        }
    $ f0 ^+ s- R7 p% X}6 t, R" {2 ~! L" `' X

    # F  r* n$ Z3 q

    归并排序法

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

    ( X% n) I/ Z& i* }' w$ ?9 ]) R
    //归并排序法& ]$ C* s6 ?* m4 F/ Z2 Z
    void merge_sort(float data[],int left,int right,float sorted_data[])
    3 r  f! F( Q( k  X* |( |& T  I{0 _3 O5 @  |2 K+ P& ~/ L1 N
            if(left<right)//排除原数组出现只有一个数据的情况(left=right), }! D, B8 |1 g
            {' H9 m+ `1 f6 S# f- F
                    int mid=(left+right)/2;* {' v% w( x% B. M8 k$ N9 I
                    merge_sort(data,left,mid,sorted_data);, J* B+ h) X" t8 |$ L
                    merge_sort(data,min+1,right,sorted_data);
    , I, |* A- @) }% ^6 |3 [                merge_array(data,left,mid,right,sorted_data);) p" [* \5 o9 x: R8 `
            }% N9 d7 ?' q5 L; B: v
    }+ M/ n8 D( _: H5 \
    void merge_array(float data[],int left,int mid,int right,float temp[])//data[]即待排子数组,直接用子数组排序,但将子数组分为两部分,temp[]即临时数组3 A! h8 x4 \$ _% d4 `
    {, q! d% g3 c4 F0 Q' a- E7 Q4 ]8 {
            int i=left,j=mid+1;
    . @% t" i2 L5 L4 s. s. J* |        int k=0;/ O' y+ O( _: F# ~# X
            while(i<=mid&&j<=right)//循环条件,将较小数组放入临时数组temp[]中,同时i变为data[i+1]或j变为data[j+1]( x, a; J$ x- M" Z, R; `. f
            {% z* h' ]& _$ p" _. L! S/ h3 L3 r# X+ K
                    if(data<=data[j])# E7 t, Q! g% ?3 b: v
                    {
    7 A2 n2 }3 @2 n$ Y2 A1 G: z9 g( b) g                        temp[k++]=data[i++];% S+ G7 n+ z& c: c/ R
                    }
    / n5 F4 H9 l  y2 s* E                else
    2 V! i' n" w1 P7 ^7 t8 ^$ I* [                        temp[k++]=data[j++];; Y% H9 _* K% t0 S& N6 K
            }
    / o; \2 P) u7 h* w# Q5 B) H# {& f        while(i<=mid)//以下两个while代表可能出现的特殊情况:i/j所在数组已经全部完成排序,但另一数组仍有>=1的元素未放入临时数组中
    % p$ N: {3 J) O                temp[k++]=data[i++];
    7 r6 J, @% l: S! c        while(j<=right)6 B% h9 T5 i4 N2 b+ I* K
                    temp[k++]=data[j++];& Q5 [/ h& g* W% B1 l2 z2 t' L
            for(i=0;i<k;i++)//将临时数组中的元素全部放入原数组中,k=right-left,k代表了数组长度
    3 P4 d# C. I; S' X                data[left+i]=temp;
    4 v! s. t# _" M! X1 }$ N4 a2 I}  S  W- j( L7 K- o6 g
    void merge_array(float data[],int left,int mid,int right,float temp[])//哨兵简化: j: e( C3 i6 y, x' Z$ W4 V
    {/ ~. l! ^3 U1 y
            int max_num=INT_MAX;
    8 H5 J: e# ]6 f; Q        int len=right-left+1;9 E0 Y1 h( l- y: C
            int data_left=new int [mid-left+2];
    6 [  Z. d7 m5 n% ^; X. \0 \0 I        int data_right=new int [right-mid+1];
    6 ?# ?. w( p# l        int i=0,j=0,k=0;
    ( T% s6 \) H! \( G/ G: W        for(int k=left;k<=mid;k++)  x& e) t% {( ^0 b9 U0 j
                    data_left[k-left]=data[k];
      L: k& `) m% w7 W1 [! Y4 x        data_left[k-left]=max_num;4 E7 ]7 G2 H5 m; k! W* t. g! |
            for(int k=mid+i;k<=right;k++)
    - `# Q+ ^# y- M4 P7 f                data_right[k-mid-1]=data[k];
    * q+ L3 K* E* A# M. T8 U        data_right[k-mid-1]=max_num;
    % R# m+ c& x- B$ U        for(int k=0;k<len;k++)
    8 i8 Y- c$ x" M) G3 W4 p        {- s& C% `' P3 @( r. A4 r% W
                    if(data_left<=data_right[j])
    : \: ^- e$ d6 k; |6 p  j                        data[k+left]=data_left[i++];6 J: c8 {: i+ r' z: h
                    else3 K( K8 Q; h5 c- b5 c
                            data[k+left]=data_right[j++];" Z# G0 X! f4 ~2 c1 i- T* g% c( a
            }
    & i$ x, n2 Z/ ?2 [4 M6 Z}
    3 {1 q& h; |2 _- f' v* O4 A$ ]7 P1 A5 Y# O. W5 ]+ ~
    3 Q# t2 {- u0 h9 P
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    涂真锦        

    1

    主题

    2

    听众

    141

    积分

    升级  20.5%

  • TA的每日心情

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

    [LV.5]常住居民I

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

    收藏,必须收藏啊3 |, W: o( c9 ]! B# A1 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
    2 F( o% b4 k4 e: D1 `收藏,必须收藏啊
    $ X  u0 l) g' I( Y& ]% x2 [
    点赞0 K& w. h, I. U5 [& V% W
    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-4-20 06:44 , Processed in 0.393293 second(s), 63 queries .

    回顶部