QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4505|回复: 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语言
    ; O' h3 ~1 P& U4 V! O. [3 n

    直接插入排序法

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


    - m: {7 C1 _2 o2 S& A//插入排序法- m! m# e5 C! l+ n# v3 b9 g
    void straightsort(int*arr,int len)
    4 l; e9 v4 s' a{
    0 O2 L, a& Z7 e        int temp,i,j;2 e7 v$ P( B+ j; q9 W
            for(i=1;i<len;i++)//将首元素看成有序数组,i=1表示从第二个元素开始排序2 x; W, n: g8 q) `& w1 q
            {
    : |  o9 a) M7 [8 ^- a                temp=arr;//temp存放待插入元素. _) S7 u1 B# x. [/ b, o# J
                    for(j=i-1;j>=0&&arr[j]>temp;j--)//待插入元素向左比较,arr[j]代表已经排序的有序数组,满足j>=0,且arr[j]>temp1 y: [% t7 Z' w. T% p  o. {1 }
                    {& q* `9 t# X* n! D
                            arr[j+1]=arr[j];//若条件成立,则将已排序数组向右移位,arr[j]最大可达arr处,即temp处
    " T; k, N3 N# A( M! m9 L0 O( i( s                }
    * L5 [% e* }7 H: |. R: D3 t! J  o: j                arr[j+1]=temp;//当循环不成立或循环终止,此时arr[j]<=temp(或j=-1,所有有序数组都大于待排元素,)temp应位于arr[j+1]处,j随temp左移而发生变化(减小)& R% K! u2 x' p! t! }
            }
    1 ]* w1 I5 j7 R: A+ J5 G$ Q) u}% P9 e4 L: L$ N. o  H  Q3 T0 x$ h
    # K! U: y9 @2 w2 K  Y, d6 o

    归并排序法

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


    5 p7 z: J* W+ y9 I* j# V" W; l//归并排序法
    $ _4 u, i) ]2 z. J) Tvoid merge_sort(float data[],int left,int right,float sorted_data[])( d- L0 x" A4 c2 l. b
    {
    ! e  V% J4 N$ H% n2 [! U  P        if(left<right)//排除原数组出现只有一个数据的情况(left=right)( e' O" i& _% {0 u! x
            {: O5 \9 |# L: d# |: K
                    int mid=(left+right)/2;
    " B0 O* U# k' J                merge_sort(data,left,mid,sorted_data);
    3 k4 N! O  Q. T* S* U                merge_sort(data,min+1,right,sorted_data);
    ! i( j6 B8 H( M/ H' z                merge_array(data,left,mid,right,sorted_data);
    % l9 Y; U' D1 j& G        }
    / Z- v3 ]9 H: p9 L1 s) N}5 Z* g  v! v# O# I: `! o4 Z3 |) @
    void merge_array(float data[],int left,int mid,int right,float temp[])//data[]即待排子数组,直接用子数组排序,但将子数组分为两部分,temp[]即临时数组( D. |3 R. m  V; V! g9 h' B
    {
    * t7 y  ~0 t6 V. k4 G9 M; r" z$ M3 ?        int i=left,j=mid+1;. Z0 l  {+ D- m' d9 i- R8 d' }+ R
            int k=0;
    6 d1 \3 P4 m- s  `5 n* L9 m7 l        while(i<=mid&&j<=right)//循环条件,将较小数组放入临时数组temp[]中,同时i变为data[i+1]或j变为data[j+1]& b) U& V5 u, H, ~- d5 {
            {$ W" l( k0 U- v
                    if(data<=data[j])
    8 D9 Y  O7 D* e) p0 ]2 s                {
    " g- P# H  m( E# [- e                        temp[k++]=data[i++];
    : f% i" |: t; |/ [2 g: o                }
    + y2 @% _& ]' h, l4 _                else
    ( J+ k6 V8 r- U% c) ^# v                        temp[k++]=data[j++];
    - M9 m0 j1 h5 \: J8 c& M6 D) {4 b        }7 }* r. C( O# R- B. _5 H/ l) x9 Q* C
            while(i<=mid)//以下两个while代表可能出现的特殊情况:i/j所在数组已经全部完成排序,但另一数组仍有>=1的元素未放入临时数组中" R* m; ]- {  o6 W5 \3 `6 f/ l4 r' w
                    temp[k++]=data[i++];, V4 Y  {, L$ b2 N6 c  J9 \
            while(j<=right)
    0 i; s: p# T- p$ E3 O: X* G                temp[k++]=data[j++];
    0 T8 E0 I* D  v% ]( k+ h6 Y6 n' ^        for(i=0;i<k;i++)//将临时数组中的元素全部放入原数组中,k=right-left,k代表了数组长度9 P9 K# b: G1 w% S' D0 a, j
                    data[left+i]=temp;
    + M' ]# o5 r& X}, L6 Q' K; L! O( Y' t6 \1 B6 ]
    void merge_array(float data[],int left,int mid,int right,float temp[])//哨兵简化
    . T" X7 A2 u% b! S{  S6 s' o' }4 \# H" F
            int max_num=INT_MAX;
    + V% I! l4 V; G+ j% s1 z        int len=right-left+1;0 `6 ^: t& R8 q& t+ J; v" i! A5 u
            int data_left=new int [mid-left+2];
    7 Y% {, }( l, V        int data_right=new int [right-mid+1];
      S" Z1 g. b/ T        int i=0,j=0,k=0;' q- }+ T( T. W, U4 }+ \/ m
            for(int k=left;k<=mid;k++)
    $ G6 Y/ L  P0 }# ]                data_left[k-left]=data[k];
    ( z) @) d( {, ^; M" [- v        data_left[k-left]=max_num;
    $ }. M! E  P* P9 \; l" `, }# P' I        for(int k=mid+i;k<=right;k++). g$ A$ o* P" l$ b# q
                    data_right[k-mid-1]=data[k];
    * M' L) q( Z8 j4 a' i1 n        data_right[k-mid-1]=max_num;
    7 L9 {" ]/ l9 e) p4 a& O: N+ j7 d        for(int k=0;k<len;k++)
    1 i  x3 x" b1 T. |* P: y: E        {  x& j8 ]- s. m0 j/ d3 z+ r  L% h
                    if(data_left<=data_right[j])" s  f$ Q8 B' S, L
                            data[k+left]=data_left[i++];: \( W7 A! |  d( H7 E* Q
                    else" t& S/ I) p+ N: F% v5 ^1 g( q
                            data[k+left]=data_right[j++];
    7 O4 y2 o( C# P        }
    ; S+ y% p: m& b! [5 j" a+ w}, a% L$ ^' T$ g& M: ^  e

    ' H  t5 Q' K9 K+ Q. s5 @7 j% r4 q* P
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    涂真锦        

    1

    主题

    2

    听众

    141

    积分

    升级  20.5%

  • TA的每日心情
    衰
    2022-10-30 20:19
  • 签到天数: 37 天

    [LV.5]常住居民I

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

    收藏,必须收藏啊
    $ ^. y% w! L; u" j

    点评

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

    使用道具 举报

    1178

    主题

    15

    听众

    1万

    积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    涂真锦 发表于 2021-11-29 17:54
    ! [; P4 U& Y8 a, G' F, V# h收藏,必须收藏啊
    6 c# `/ ^; {- s: |; T
    点赞
    $ U& J3 S0 X/ F) i* b3 I- S
    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-10-23 05:17 , Processed in 0.435764 second(s), 63 queries .

    回顶部