QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4305|回复: 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语言
    & i" r% `$ v0 Q3 w# D3 Z" s

    直接插入排序法

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


    # w5 D) q: |' v+ q//插入排序法6 T* u- J- B  d2 E9 z& K0 w
    void straightsort(int*arr,int len)
    ! @6 }4 q- h2 y2 _) J2 ~{! X% h2 ~3 Z8 R5 U
            int temp,i,j;& ?; }- }) O5 ~. L" B8 m
            for(i=1;i<len;i++)//将首元素看成有序数组,i=1表示从第二个元素开始排序
    " p$ z: ?& t/ }        {* R7 \! @: e+ L3 v& {1 @+ V; n! P
                    temp=arr;//temp存放待插入元素
    7 H& {8 _& t' O: E: b* [' k                for(j=i-1;j>=0&&arr[j]>temp;j--)//待插入元素向左比较,arr[j]代表已经排序的有序数组,满足j>=0,且arr[j]>temp
    " Y' C3 |7 h, s) y  o& x7 _                {
    . U1 @6 n* F; W. u  L$ r+ s                        arr[j+1]=arr[j];//若条件成立,则将已排序数组向右移位,arr[j]最大可达arr处,即temp处
    . R4 a+ k% ^' g$ f5 v                }
    / \* r+ S4 E, d) K8 _/ m) J                arr[j+1]=temp;//当循环不成立或循环终止,此时arr[j]<=temp(或j=-1,所有有序数组都大于待排元素,)temp应位于arr[j+1]处,j随temp左移而发生变化(减小)
    5 A3 b. J6 G7 V        }
    - E. y$ u$ d& m}. J  R5 n: h7 Z2 d4 {$ {$ D, ?

    / L9 P. u4 t. J# ?; j% _: n

    归并排序法

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

    ( n! S4 I& i5 T# H0 b; h
    //归并排序法
    6 K/ `9 V; M8 i! }: {4 fvoid merge_sort(float data[],int left,int right,float sorted_data[])$ k; R, G4 X& D' O  i
    {
    . d3 f6 E# @6 ?0 ]        if(left<right)//排除原数组出现只有一个数据的情况(left=right)
    * J) D9 C2 ~* d3 J2 c        {
    & \9 R3 j( R% s3 B3 q' j( c                int mid=(left+right)/2;
    0 C4 ]; r6 l+ ^; E: q9 J* D% M                merge_sort(data,left,mid,sorted_data);
    - l& |. O& [9 ]1 R$ ]  F                merge_sort(data,min+1,right,sorted_data);0 g4 d) z+ y! J3 [, M
                    merge_array(data,left,mid,right,sorted_data);; `8 Z/ i; @) m. g8 q$ ?  Z
            }
    % q8 f9 i6 f: g. i/ Z0 G& F+ Z}
    + Q  E9 [7 W, e' Q  h3 y0 o2 B! I9 fvoid merge_array(float data[],int left,int mid,int right,float temp[])//data[]即待排子数组,直接用子数组排序,但将子数组分为两部分,temp[]即临时数组
    5 l- b- c; @0 a. F* H{
    " V  R  l6 D" |$ |1 }        int i=left,j=mid+1;
    ) a* A5 n; W% R4 [) q: B8 G" f. |, i1 V        int k=0;$ c: v* p$ u& S% w3 X/ m, U
            while(i<=mid&&j<=right)//循环条件,将较小数组放入临时数组temp[]中,同时i变为data[i+1]或j变为data[j+1]" S2 q+ R3 j, }! j
            {2 Q! v2 y* b9 @
                    if(data<=data[j])9 G) J5 E  a3 m3 P2 x
                    {
    " r% v6 L: J$ Y- x2 O, K! v                        temp[k++]=data[i++];. U2 f' x% N0 h# c) D% q  p1 }
                    }" k2 s! t8 @2 X
                    else
    , z* C. d2 t* ?6 D4 M9 ]3 J                        temp[k++]=data[j++];4 h+ O5 U. _- H
            }/ f3 @$ H( N' R; j/ Q* h" a# [
            while(i<=mid)//以下两个while代表可能出现的特殊情况:i/j所在数组已经全部完成排序,但另一数组仍有>=1的元素未放入临时数组中- t: W! m0 V6 {7 u$ I) Z
                    temp[k++]=data[i++];; X) N; I8 b0 x
            while(j<=right)+ }$ j9 _& @% L
                    temp[k++]=data[j++];& T& o! f  P3 T6 x
            for(i=0;i<k;i++)//将临时数组中的元素全部放入原数组中,k=right-left,k代表了数组长度% u2 A, L3 C$ |3 P
                    data[left+i]=temp;
    * j5 m9 g( S9 P+ @* I7 V; _}1 Q4 I* ~- E; p5 x2 u6 Q
    void merge_array(float data[],int left,int mid,int right,float temp[])//哨兵简化
    & b- o, Y2 p: C. p, |0 }{
    ! t8 W. X# I7 Q( x        int max_num=INT_MAX;( b% E* p% [# n  Q1 Z+ D
            int len=right-left+1;% e  k& z- J0 b' r- }  o% x
            int data_left=new int [mid-left+2];
    , m' j) G  M9 I1 e2 N8 P5 l        int data_right=new int [right-mid+1];
    9 C! E* p- O6 |5 w4 F! z' O, r        int i=0,j=0,k=0;% G4 P1 b( s* k: `; j1 S2 |
            for(int k=left;k<=mid;k++)
    2 e3 T' N2 ~* @+ J3 a                data_left[k-left]=data[k];7 Y3 z3 U8 w4 `) R! s! d5 L
            data_left[k-left]=max_num;, y+ D2 a1 A7 |) ^  f4 \
            for(int k=mid+i;k<=right;k++)
    ! y7 w: b3 V1 ^- J                data_right[k-mid-1]=data[k];: u* y4 u$ q$ l6 P
            data_right[k-mid-1]=max_num;
    3 e0 H4 v/ `4 x        for(int k=0;k<len;k++)7 E% v" A' x6 I2 v8 Q+ U$ }. h
            {
    # Y2 R. c5 E5 b* W2 n1 e                if(data_left<=data_right[j])
    ; U# l' q  {; h$ c; q8 h9 Y" t6 F                        data[k+left]=data_left[i++];( ?. {3 v) ~% R; b
                    else
    ! \" t7 }, s) v) t% k# [( d  T                        data[k+left]=data_right[j++];
    : T3 e# j- V0 V' b        }* g! O; K- g3 r6 ^
    }3 q& z% |) T' w* Q

    : _0 m/ r- Y$ T1 O' ~( n
    $ ?& \% d9 y7 B
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    涂真锦        

    1

    主题

    2

    听众

    141

    积分

    升级  20.5%

  • TA的每日心情

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

    [LV.5]常住居民I

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

    收藏,必须收藏啊
    / A: ~5 P6 X/ q1 W; }- ^* l

    点评

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

    使用道具 举报

    1178

    主题

    15

    听众

    1万

    积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    涂真锦 发表于 2021-11-29 17:54
    4 G$ p9 V4 y$ Q6 g6 r. B收藏,必须收藏啊

    ) @" F' J: o/ {. @3 V点赞
    4 V0 q7 C" e# C
    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-7-19 20:01 , Processed in 0.340312 second(s), 62 queries .

    回顶部