QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4161|回复: 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语言
    4 K8 l, g$ R0 k

    直接插入排序法

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


    3 b3 l) J/ {) _; P" z/ m//插入排序法
    ( I$ h4 V+ ]& c* _0 H% P8 J2 r2 Xvoid straightsort(int*arr,int len)
    & P8 ~+ r/ h/ }8 d9 K3 O+ \$ g/ G6 J{
    / D2 x3 E* _$ N: t7 e3 C1 U        int temp,i,j;- C7 t, v- M- B9 T. n* a8 f
            for(i=1;i<len;i++)//将首元素看成有序数组,i=1表示从第二个元素开始排序
    6 L" A1 Z5 C- @        {6 {! O3 `/ A1 t7 o& ]  L
                    temp=arr;//temp存放待插入元素
    $ x6 ?- [7 d" H8 K% d                for(j=i-1;j>=0&&arr[j]>temp;j--)//待插入元素向左比较,arr[j]代表已经排序的有序数组,满足j>=0,且arr[j]>temp
    . }/ {! I2 `# B+ I( k/ w( L( p" K                {7 f1 K$ P% ]0 c& Y, N1 w4 ]; X
                            arr[j+1]=arr[j];//若条件成立,则将已排序数组向右移位,arr[j]最大可达arr处,即temp处
    ( N: g. q! v/ c  b0 r                }% C( i/ Z  M% V
                    arr[j+1]=temp;//当循环不成立或循环终止,此时arr[j]<=temp(或j=-1,所有有序数组都大于待排元素,)temp应位于arr[j+1]处,j随temp左移而发生变化(减小)% }+ c% e' @  [; V6 h- U! H; `7 r
            }1 p! [: W% B# @+ f
    }  y+ N& h  ^0 n3 T" w& }: C: K

    # `* y9 g  @( r) f5 `$ e3 i

    归并排序法

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


    0 a4 b6 M$ o9 L! g//归并排序法
    ( y' M) X- G/ O: C. N5 uvoid merge_sort(float data[],int left,int right,float sorted_data[])
    % X4 c4 N$ j; p{
    + b, K* T' g6 |) \6 V* @8 w        if(left<right)//排除原数组出现只有一个数据的情况(left=right)
    " R' g: R7 Y0 m5 D+ F. q        {
    5 ~$ K# v4 g7 \0 u" g* B0 W3 ~  n* K                int mid=(left+right)/2;
    6 B& v( }# A) U' J( @5 r                merge_sort(data,left,mid,sorted_data);# d0 n0 [# n, @/ T$ u: Z% m
                    merge_sort(data,min+1,right,sorted_data);2 ]- j7 e5 ]3 V, D5 g+ ?2 x2 N5 B
                    merge_array(data,left,mid,right,sorted_data);
    / @; P5 V: d7 o* d! k1 ?- r        }7 q- C% F6 U* U  C
    }- w9 {' ^1 u: n) R4 ^" d
    void merge_array(float data[],int left,int mid,int right,float temp[])//data[]即待排子数组,直接用子数组排序,但将子数组分为两部分,temp[]即临时数组3 j; }+ r+ _$ t5 D. _- Y$ ?
    {
    1 p) U) W. o" S* X        int i=left,j=mid+1;
    2 e& W; P/ P+ w5 T" n        int k=0;  A" E9 I. o2 f" N( f) D. G
            while(i<=mid&&j<=right)//循环条件,将较小数组放入临时数组temp[]中,同时i变为data[i+1]或j变为data[j+1]
    1 T. c, s! E. r& w( N2 H        {3 k) t) f, ?1 a9 T* J
                    if(data<=data[j])
    # K; _9 F  G' u6 S$ @, o) U                {
    0 p% ]9 O9 Q1 z5 x. B1 _                        temp[k++]=data[i++];
    9 a$ X6 W! y2 d% r                }
    # \( @" H; a2 y$ B4 W* g5 }: h                else* q& F  R" r( Z* B8 ]8 }
                            temp[k++]=data[j++];" ^& H3 _% P6 Q) Z6 h4 B- F
            }% Y9 L. t- x( K# t9 p/ ~
            while(i<=mid)//以下两个while代表可能出现的特殊情况:i/j所在数组已经全部完成排序,但另一数组仍有>=1的元素未放入临时数组中
    ) K8 S! s* Y$ \7 K                temp[k++]=data[i++];2 \. W8 j, F& E4 l; z" Q' o
            while(j<=right)$ x1 M2 [/ t1 m* Y3 `
                    temp[k++]=data[j++];
    7 q$ s2 s, v/ o        for(i=0;i<k;i++)//将临时数组中的元素全部放入原数组中,k=right-left,k代表了数组长度
    ! N$ i5 a0 ~4 j3 M4 S                data[left+i]=temp;3 o1 I# M" a3 R" s/ A9 r- M
    }& z8 N8 J/ j8 _; Z
    void merge_array(float data[],int left,int mid,int right,float temp[])//哨兵简化7 \1 a+ a1 L  j8 G) p5 g
    {
    ; K3 t3 Y% j, ^5 x6 D. S* L& A3 F        int max_num=INT_MAX;
    3 k$ e  s6 {/ l        int len=right-left+1;
    ) q# {9 \( h$ l9 D: f& F. U        int data_left=new int [mid-left+2];
    * T0 p+ E( [; u5 h8 n: d        int data_right=new int [right-mid+1];: G; R- _- @& l0 m! }5 H
            int i=0,j=0,k=0;" d3 ~, [  e" i( ~
            for(int k=left;k<=mid;k++)9 y5 v! Q4 W9 [3 s
                    data_left[k-left]=data[k];1 O1 o) Y0 W6 e4 I9 y) W
            data_left[k-left]=max_num;
    % n0 z: p. a3 ~" w, F, v' m$ _        for(int k=mid+i;k<=right;k++)
    ! J: x( v8 }! ^: ^& g7 p                data_right[k-mid-1]=data[k];8 t) C8 @: q0 @! T8 h# n7 y2 U* A/ Z
            data_right[k-mid-1]=max_num;
      S0 o& j% X) g4 Z) f        for(int k=0;k<len;k++)4 b- @8 E9 a9 {6 e, C! Q
            {/ s; ?5 R. B; A2 A" \
                    if(data_left<=data_right[j])2 q" B! t1 d  A: c1 Q
                            data[k+left]=data_left[i++];
    * v( r$ Y0 Z* P1 w                else* {# h* e5 [$ S" M" [# Z
                            data[k+left]=data_right[j++];1 a3 `& f) ^* y
            }
    ) C6 t. V3 x: Q+ c, A4 n}
    + A; c7 Q4 r7 M; b' B
    ( N8 a1 @4 ~2 K. R5 ~2 R
      a- T  g* E4 ]! N* ]
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    涂真锦        

    1

    主题

    2

    听众

    141

    积分

    升级  20.5%

  • TA的每日心情

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

    [LV.5]常住居民I

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

    收藏,必须收藏啊
    & K" i- x, j4 \3 O& Z. P+ R

    点评

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

    使用道具 举报

    1178

    主题

    15

    听众

    1万

    积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    涂真锦 发表于 2021-11-29 17:54
    / x6 Z- j# {- `9 M+ [收藏,必须收藏啊

    0 m9 d3 j5 D: Y点赞
    6 R+ t* q. n! O( `! `' t
    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2025-12-30 00:15 , Processed in 1.559208 second(s), 62 queries .

    回顶部