QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4230|回复: 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语言/ b% E3 ^' t. z7 w

    直接插入排序法

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

    + {- c4 L3 H! n& K. S
    //插入排序法
    ) N# F9 T$ s6 C5 r0 ^3 j6 Svoid straightsort(int*arr,int len)7 `( s; c- }1 k$ f9 H; \0 F
    {
    6 k* U; `% `6 R5 ~2 }7 h- R        int temp,i,j;
    2 y, w* k& k0 C! G; X& M7 t        for(i=1;i<len;i++)//将首元素看成有序数组,i=1表示从第二个元素开始排序
    1 o: a) w9 i6 Y        {9 g: c/ M4 ~8 T% a' g  s
                    temp=arr;//temp存放待插入元素
    ) w6 p' r$ b$ y+ L                for(j=i-1;j>=0&&arr[j]>temp;j--)//待插入元素向左比较,arr[j]代表已经排序的有序数组,满足j>=0,且arr[j]>temp
    $ z# o% k* [3 S0 `/ n2 o                {
    $ j# U  i& w  `- |* H: W5 B                        arr[j+1]=arr[j];//若条件成立,则将已排序数组向右移位,arr[j]最大可达arr处,即temp处
    % S6 J' ]* H& U% D' C                }
    ) B  u1 c6 e( P/ g                arr[j+1]=temp;//当循环不成立或循环终止,此时arr[j]<=temp(或j=-1,所有有序数组都大于待排元素,)temp应位于arr[j+1]处,j随temp左移而发生变化(减小)
    ( D9 m2 W7 q0 U" {" R' A        }$ Y+ t& u! _* q( x* }; d
    }
      c5 c& x0 k* S
    $ f% Y0 V* z, P% x0 r# @

    归并排序法

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

    ! d" K# d) i) i* @
    //归并排序法$ g+ V" \4 a2 p5 _+ n1 M$ }
    void merge_sort(float data[],int left,int right,float sorted_data[]); L" ]& N/ _& J5 G" A! l
    {) R4 F/ O, Y) }" f/ i# ]% v
            if(left<right)//排除原数组出现只有一个数据的情况(left=right)0 F  ~' i' c1 {3 g: T5 i3 o  B1 i
            {
    * \6 ]8 s7 |" e" |6 v                int mid=(left+right)/2;9 ]! w" r* K- n* V6 o# d
                    merge_sort(data,left,mid,sorted_data);* X( `* a& e1 o4 j
                    merge_sort(data,min+1,right,sorted_data);, C) @6 Z! @- Z  V9 r% j+ _
                    merge_array(data,left,mid,right,sorted_data);2 \" D5 Y0 R2 G1 ~
            }
    8 v/ p3 u3 {5 ?  Z0 c% X}
    * I+ ?# ?6 }, u+ a' H) avoid merge_array(float data[],int left,int mid,int right,float temp[])//data[]即待排子数组,直接用子数组排序,但将子数组分为两部分,temp[]即临时数组
    ! d7 q+ S9 N1 d& i! ~+ _5 E' O{
    " x: _# V: b0 X, U        int i=left,j=mid+1;6 u% X  b7 y+ f! ~
            int k=0;
    - c+ [/ x0 B& q3 `' `        while(i<=mid&&j<=right)//循环条件,将较小数组放入临时数组temp[]中,同时i变为data[i+1]或j变为data[j+1]7 M0 L* M5 L" \& O& d4 r2 k* e
            {/ _8 P* `3 Y! j: |, E
                    if(data<=data[j])
    # x! Y# H- S2 O: A2 z" M" S                {
    6 m' @9 p9 }% f$ E                        temp[k++]=data[i++];
    % P7 P/ E6 P: g9 {4 g                }
    4 Y! p! I1 C( q4 c0 {7 {7 x+ L                else
    ! I2 f! b/ e+ l( C0 s0 ^* X9 I                        temp[k++]=data[j++];
    2 n; n8 t+ ]  \$ N/ X' Z+ v. z) Z        }
    ( G4 r' M! A( ]+ o& e        while(i<=mid)//以下两个while代表可能出现的特殊情况:i/j所在数组已经全部完成排序,但另一数组仍有>=1的元素未放入临时数组中
    1 \% C2 Q5 q# r! Q5 e/ S% ?                temp[k++]=data[i++];
    & |' @6 `! N- O. f        while(j<=right)
    0 b4 Q7 X/ D2 ~) _7 W, V                temp[k++]=data[j++];
    2 L. w& A) i8 d2 F; ~; f) v! O        for(i=0;i<k;i++)//将临时数组中的元素全部放入原数组中,k=right-left,k代表了数组长度1 A6 d! D" x) |- J5 w
                    data[left+i]=temp;, x" k; Z8 M4 f, ]0 |3 @! ]
    }
    7 F# e0 w  T( o0 \# ^2 vvoid merge_array(float data[],int left,int mid,int right,float temp[])//哨兵简化
    $ q  @9 n- k8 n& j6 M/ n' C{
    2 P% e: f  Q# U0 y" d1 h; i        int max_num=INT_MAX;6 m0 C( _% c2 q
            int len=right-left+1;) `* y, ^- g$ V- b- W0 V5 d
            int data_left=new int [mid-left+2];
    . `* v6 \" l( S2 j1 t/ H+ w        int data_right=new int [right-mid+1];# }! \: ?9 l5 X8 \
            int i=0,j=0,k=0;5 C& ~  R, v. \& w3 W4 M% z) E
            for(int k=left;k<=mid;k++)) d/ O% ]& @. W5 x# g
                    data_left[k-left]=data[k];9 A: V7 M8 j5 ?
            data_left[k-left]=max_num;
    ; U# o" y% H9 [; H9 o# i$ J! [        for(int k=mid+i;k<=right;k++)
    1 x2 P. b3 b2 Z$ G1 A; v1 U                data_right[k-mid-1]=data[k];
    * P' \( j9 M- l/ f        data_right[k-mid-1]=max_num;
    5 j1 n1 k2 g+ O# t6 d- ~        for(int k=0;k<len;k++): s9 E/ _1 r4 O! N$ Q/ u
            {
    " @& i) t- z4 e5 W" M: T# Y$ L                if(data_left<=data_right[j])
    $ U& [6 F  l& P                        data[k+left]=data_left[i++];
    , `/ ?( L+ Q+ ^* h0 D# L                else
    " R( y7 z8 J- I                        data[k+left]=data_right[j++];4 M5 o% E' z' C  e
            }
    ' Q+ k/ U" k" r7 b}
    + b. q6 N4 t% }5 ?; X& g3 t
    1 I7 b2 g7 d7 K9 G$ N
    3 e/ F& _$ A7 _0 j
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信

    1178

    主题

    15

    听众

    1万

    积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    涂真锦 发表于 2021-11-29 17:54 : _9 d+ O4 H3 ]6 D3 W  `
    收藏,必须收藏啊
    ; C1 \% H1 i. k: p, P8 o
    点赞
    5 z( v! Y$ i5 E3 E& {  b* n2 q- r
    回复

    使用道具 举报

    涂真锦        

    1

    主题

    2

    听众

    141

    积分

    升级  20.5%

  • TA的每日心情

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

    [LV.5]常住居民I

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

    收藏,必须收藏啊
    ) E  _$ S6 n: V8 P0 u5 Z. F, G6 G

    点评

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

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-4-21 05:55 , Processed in 0.449076 second(s), 66 queries .

    回顶部