QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4308|回复: 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语言9 T2 B6 x: I# z; V

    直接插入排序法

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


      A& E6 A- l+ \- }8 U//插入排序法
    - e" @0 g) h+ Y) G1 Bvoid straightsort(int*arr,int len)
    ; I) q$ x' Z7 R2 o. s# Y" x{
    * K" V1 k) T% g: J% ^& B        int temp,i,j;' y/ P0 w- P6 ^* Z! r) `" W
            for(i=1;i<len;i++)//将首元素看成有序数组,i=1表示从第二个元素开始排序
    / O) {2 R( a" I' `6 ^        {! H% m! H; m7 l$ r( J
                    temp=arr;//temp存放待插入元素
    4 h$ M3 h' V1 e) P1 P! Q% e3 l# H                for(j=i-1;j>=0&&arr[j]>temp;j--)//待插入元素向左比较,arr[j]代表已经排序的有序数组,满足j>=0,且arr[j]>temp
    7 A6 W  G) y5 `5 t! _+ L                {3 U& v0 `0 P# ^
                            arr[j+1]=arr[j];//若条件成立,则将已排序数组向右移位,arr[j]最大可达arr处,即temp处
    2 M4 \( i" L+ z) p2 r8 ?                }
    4 [1 O0 L5 k( P# j, ?6 b+ U                arr[j+1]=temp;//当循环不成立或循环终止,此时arr[j]<=temp(或j=-1,所有有序数组都大于待排元素,)temp应位于arr[j+1]处,j随temp左移而发生变化(减小)! K! l' t* S6 E8 t$ ^6 V
            }# ]) [2 I" \/ k7 Q/ F- E3 Q1 U9 h
    }, E, l, T/ @3 @# _# G8 c- e$ g
    8 t+ J1 K( z- d% M

    归并排序法

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


    $ _/ ]& v$ ?' L4 W5 [//归并排序法! h' A' D/ K: t) T5 w% z
    void merge_sort(float data[],int left,int right,float sorted_data[])
    ) w& k  h+ |* q9 O8 Q{
    7 y7 O* f& G+ B- |; g  f        if(left<right)//排除原数组出现只有一个数据的情况(left=right)
    ; B, f# w5 R8 K5 D        {
    - H) k+ ]3 N3 k9 o& h# q                int mid=(left+right)/2;6 }3 b, G4 v  J8 _8 I! R
                    merge_sort(data,left,mid,sorted_data);4 i' @; T1 e: d7 F: |* T. U
                    merge_sort(data,min+1,right,sorted_data);: G6 {9 ?2 T0 I
                    merge_array(data,left,mid,right,sorted_data);: v; i- f" |/ P" o
            }
    8 d3 x! {7 e6 g% x2 P}* u, a  F* N* Q  f6 P) w4 m" w# H
    void merge_array(float data[],int left,int mid,int right,float temp[])//data[]即待排子数组,直接用子数组排序,但将子数组分为两部分,temp[]即临时数组
    , h! n6 f0 ~$ f3 i" X{
    + A4 N1 P3 L  J        int i=left,j=mid+1;
    * M0 \; S. X& D/ _, R# x: s9 ?( ~        int k=0;+ e% X# O  y, Z, A% H0 e
            while(i<=mid&&j<=right)//循环条件,将较小数组放入临时数组temp[]中,同时i变为data[i+1]或j变为data[j+1], q  E, H* R7 @1 n, e
            {" T2 j& x1 i  d
                    if(data<=data[j])
    ' v* m: Z6 |0 @/ ^$ u                {6 w4 ]1 ~; e: r- J
                            temp[k++]=data[i++];, q& E+ }5 y8 @9 D: P2 {% Y: L$ k
                    }4 D+ p6 f( H) [) k0 N8 N( c
                    else
    - S+ Z$ Y* m3 p1 N  L: @: \                        temp[k++]=data[j++];1 l3 v5 a9 D) j- z9 V
            }; _8 q4 n) b0 g6 I7 S
            while(i<=mid)//以下两个while代表可能出现的特殊情况:i/j所在数组已经全部完成排序,但另一数组仍有>=1的元素未放入临时数组中
    * e- w+ @1 m: E6 @; ]: i9 n                temp[k++]=data[i++];9 a. ]% K; A: l
            while(j<=right)
    3 b4 K9 v7 e( @- x9 \! Z( e0 D5 ^$ m2 \                temp[k++]=data[j++];
    - Z) ^5 ~3 P# N& C9 Y7 g  _        for(i=0;i<k;i++)//将临时数组中的元素全部放入原数组中,k=right-left,k代表了数组长度
    . N  ~" R( h: E! K" {1 _                data[left+i]=temp;
    5 M- g$ h" F# b}& R" m$ Z  N- k6 @7 ^
    void merge_array(float data[],int left,int mid,int right,float temp[])//哨兵简化
    4 }0 c) R7 {3 L; \1 h) v{
    ; u2 ]1 l% b) h) |9 D; e        int max_num=INT_MAX;1 r1 e* V+ Q3 N. k( R0 q  D+ ]$ ]
            int len=right-left+1;
    ! J4 [- j% u1 I        int data_left=new int [mid-left+2];
    ) v) T" h& s+ W        int data_right=new int [right-mid+1];% M' k0 b9 ^. C+ Q
            int i=0,j=0,k=0;1 e. h5 c# C" J+ J
            for(int k=left;k<=mid;k++)% y$ E) m7 N1 @
                    data_left[k-left]=data[k];# ~+ l! o8 x) K, \: Y# L
            data_left[k-left]=max_num;! i. R+ \9 _' B+ w( Q$ A
            for(int k=mid+i;k<=right;k++)
    5 v  ~( Q( _0 p" d                data_right[k-mid-1]=data[k];' L8 B" S: q% Z' w! H
            data_right[k-mid-1]=max_num;$ h4 L+ K; b4 C8 R
            for(int k=0;k<len;k++)1 K0 D" z) b6 C% L! o& J8 f7 N5 Y/ }5 v
            {
    ( n& [  D# ?& A/ E                if(data_left<=data_right[j])
    - A2 }: `9 @* [- x* C                        data[k+left]=data_left[i++];
    " h6 a6 d/ m2 m* P& k                else5 d! g1 f0 p6 w; R; x
                            data[k+left]=data_right[j++];
    0 h0 b' h( v$ B) v, w8 V$ i        }
    5 O0 w; N  A4 c! m}* w6 f% W! e( R) N9 ^- {

    0 ^! r6 o$ T3 e% U, G1 c+ e  [- T1 u9 g0 N
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    涂真锦        

    1

    主题

    2

    听众

    141

    积分

    升级  20.5%

  • TA的每日心情

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

    [LV.5]常住居民I

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

    收藏,必须收藏啊- @0 c4 @3 v% o. o7 p- K) 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 1 `: H6 D: Z/ J/ E3 k
    收藏,必须收藏啊
    ) R( S% Z9 P) Q
    点赞* L1 H: p7 i9 @8 T
    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-7-20 07:12 , Processed in 0.480869 second(s), 63 queries .

    回顶部