QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4227|回复: 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语言, E# V% w6 g6 B+ S6 V( _5 `( R

    直接插入排序法

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

    $ \3 J0 M! q+ [
    //插入排序法( W5 A/ q! v; ^( w5 V  r$ @5 C
    void straightsort(int*arr,int len)& ~: x# V/ l' s
    {
    : o& L- g1 b) E9 t* }        int temp,i,j;
    ( _  z9 `$ s. D7 B1 D% g, ^3 }/ Z7 |        for(i=1;i<len;i++)//将首元素看成有序数组,i=1表示从第二个元素开始排序
    $ i! l6 J  [1 L, n2 m4 |2 I        {( ]( ~+ W+ u7 S( K
                    temp=arr;//temp存放待插入元素0 I2 |% g/ V# R% c% d
                    for(j=i-1;j>=0&&arr[j]>temp;j--)//待插入元素向左比较,arr[j]代表已经排序的有序数组,满足j>=0,且arr[j]>temp
    " _- C9 E+ p+ N7 V% F6 D. o                {' T1 H2 z* R0 W1 b8 ]
                            arr[j+1]=arr[j];//若条件成立,则将已排序数组向右移位,arr[j]最大可达arr处,即temp处/ j4 r" R8 @  c' |2 h# Q! U- F: X' `
                    }% X) W) t1 T. @& Z
                    arr[j+1]=temp;//当循环不成立或循环终止,此时arr[j]<=temp(或j=-1,所有有序数组都大于待排元素,)temp应位于arr[j+1]处,j随temp左移而发生变化(减小)
    $ M, S, ^- g$ ^) ^        }
    0 c& r6 v2 W, s7 R}
    " x( |, ]0 S4 ]( k6 ]. s( h( G$ L& O0 }/ a# z+ e5 p# F

    归并排序法

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


    7 d* l7 S* S& T! l7 I  \6 _//归并排序法5 [2 b, H* Y/ N: ]4 q0 J
    void merge_sort(float data[],int left,int right,float sorted_data[])
    5 U; |- o9 \# Z$ b4 I. Y{9 L4 M, g7 C) ?: ~- i8 P
            if(left<right)//排除原数组出现只有一个数据的情况(left=right): ?% V- `' W9 b  `2 M, U
            {
    $ \6 S) @4 x9 ]5 l5 z* s- T$ U                int mid=(left+right)/2;
    ; \( {* ^& r0 j0 k                merge_sort(data,left,mid,sorted_data);
    7 }( V& x! g! C) u# H, E( `                merge_sort(data,min+1,right,sorted_data);5 u& L# v4 c% v( G3 q# [
                    merge_array(data,left,mid,right,sorted_data);
    % A. Y, N* z; h, [) ~8 z        }
    + G$ X7 s; `* q4 z7 j}: d) I8 L2 i$ ~& X: N
    void merge_array(float data[],int left,int mid,int right,float temp[])//data[]即待排子数组,直接用子数组排序,但将子数组分为两部分,temp[]即临时数组
    ! q3 l# X7 h% Z, G, f{2 `0 e2 P! U9 Y/ E; \
            int i=left,j=mid+1;0 P. y' i+ }! `( t, u
            int k=0;/ ~1 G% t* O6 H8 S1 K
            while(i<=mid&&j<=right)//循环条件,将较小数组放入临时数组temp[]中,同时i变为data[i+1]或j变为data[j+1]
    - `! w; i$ ~. X# w) a3 I& O        {
    ! i+ P/ g) L; f- B- X7 w" o! M                if(data<=data[j])
    . b6 K$ [  y, q* x* O) M                {
    8 p0 M3 L# T8 X& \% n0 @" \- h                        temp[k++]=data[i++];+ G- R! {' m8 k! v- s/ N
                    }! S. r; u4 I6 E* z/ l
                    else3 D* ^, L1 J* f
                            temp[k++]=data[j++];* }9 e) W2 c! l4 R
            }
    5 e+ v3 z0 p* @- L9 G$ a' k        while(i<=mid)//以下两个while代表可能出现的特殊情况:i/j所在数组已经全部完成排序,但另一数组仍有>=1的元素未放入临时数组中& x/ M. I( l( P: l
                    temp[k++]=data[i++];
    3 u) A! A+ N/ _$ K! B, ?        while(j<=right)
    & d* `8 d# U3 S4 m. p                temp[k++]=data[j++];4 N& M; x+ m8 z4 O% s; n6 U" P- {
            for(i=0;i<k;i++)//将临时数组中的元素全部放入原数组中,k=right-left,k代表了数组长度
    # Z4 S, T( [$ }* E+ a; v! m8 C4 E: Y                data[left+i]=temp;4 w5 x! X& n9 X
    }" V$ Z  L0 S0 K/ k3 ~% \6 {
    void merge_array(float data[],int left,int mid,int right,float temp[])//哨兵简化
    $ _! m/ }: b$ J{
      y* I1 s2 p* ]( Z        int max_num=INT_MAX;1 ^% l+ p7 S( L0 G3 S  ~
            int len=right-left+1;
      ~# u5 M1 P+ h4 K% U, x$ Y1 X- f        int data_left=new int [mid-left+2];# G$ l. G; S, J% t
            int data_right=new int [right-mid+1];4 W: ^) \: d; y
            int i=0,j=0,k=0;- d- t; b& c- `
            for(int k=left;k<=mid;k++)
    : P. V+ ~* P4 Q3 [! S0 x                data_left[k-left]=data[k];% ]+ y0 T' m- b; H3 g/ v3 Y3 ?
            data_left[k-left]=max_num;
    ; q4 D- L' i0 _        for(int k=mid+i;k<=right;k++)
    $ A: V6 [6 e9 O- t/ b" C                data_right[k-mid-1]=data[k];
    , \. g8 M1 z4 z$ }        data_right[k-mid-1]=max_num;# |* V1 y0 H" T2 Y" h3 G
            for(int k=0;k<len;k++)
    + e0 u* d% @) _  Z        {( b) p, C6 c; E1 v& [
                    if(data_left<=data_right[j])/ f) S1 e' H/ |
                            data[k+left]=data_left[i++];
    2 U% C3 p! f5 v& j0 Q5 G                else) o# ^: F3 x* E! {: `
                            data[k+left]=data_right[j++];
      ~' \' \3 I0 j$ X! K) E* R% |        }
    $ f: g0 ~) W! N, @& Y}$ k- o3 k% O# r$ v

    / z4 f5 M  b: X9 P4 h: @1 X- \+ |" ]; S  L+ l0 L1 p
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    涂真锦        

    1

    主题

    2

    听众

    141

    积分

    升级  20.5%

  • TA的每日心情

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

    [LV.5]常住居民I

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

    收藏,必须收藏啊
    , m8 f2 l, A5 L6 O: O

    点评

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

    使用道具 举报

    1178

    主题

    15

    听众

    1万

    积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    涂真锦 发表于 2021-11-29 17:54 . t& L- T6 y, X- d- J, y) v7 _( G
    收藏,必须收藏啊
    . q) d5 S/ x! ~0 {
    点赞! q$ f6 _) K8 R. _: P
    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-4-20 08:56 , Processed in 0.418243 second(s), 63 queries .

    回顶部