QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4256|回复: 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语言
    % ?+ Y2 I1 j7 Z. I6 }: H

    直接插入排序法

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


    8 |' Z$ x& O9 k7 A% |+ ~* A% W//插入排序法
    * e* h4 Z& R/ j9 e9 O3 Z: G1 n& G( ]0 R* y# ?void straightsort(int*arr,int len)5 w( S3 \" t# V
    {
    9 k- e# x3 q6 `; U3 ?7 I! u8 R        int temp,i,j;3 y. m7 X3 A, L* d
            for(i=1;i<len;i++)//将首元素看成有序数组,i=1表示从第二个元素开始排序
      ?8 q4 d% J; ?2 l- ]8 r        {+ [0 K2 z  ?5 @- O
                    temp=arr;//temp存放待插入元素
    # Y. ~, V) z: V: P" i                for(j=i-1;j>=0&&arr[j]>temp;j--)//待插入元素向左比较,arr[j]代表已经排序的有序数组,满足j>=0,且arr[j]>temp5 I; Z4 u$ a2 B2 \3 o: V5 Y
                    {
    . d7 n' C' |9 Z# K) u: g- w' w% j                        arr[j+1]=arr[j];//若条件成立,则将已排序数组向右移位,arr[j]最大可达arr处,即temp处
    2 w' l. r" j2 q0 ~, v9 w                }
    ( c* o9 j9 z% }6 `/ G2 v$ E  O4 i                arr[j+1]=temp;//当循环不成立或循环终止,此时arr[j]<=temp(或j=-1,所有有序数组都大于待排元素,)temp应位于arr[j+1]处,j随temp左移而发生变化(减小)9 f% x+ H8 E% U
            }
    % [0 T4 S! s* c, M! g! ^# o6 w5 b}8 D6 {. L, n3 L& ]

    # w/ @, O* r- [6 E) F/ y

    归并排序法

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


    9 U$ [6 t  R/ a. r3 M//归并排序法: Y7 f1 f& {8 L
    void merge_sort(float data[],int left,int right,float sorted_data[])4 f8 ]! L5 [4 g. R. n& U9 t* q
    {
    ( v" z% q; Y0 ^7 s7 {8 k9 j        if(left<right)//排除原数组出现只有一个数据的情况(left=right)
    7 h3 S- w2 ~! O        {+ C* L4 H  m3 U; c* Q; I3 o
                    int mid=(left+right)/2;
    2 y0 p. v7 R4 e& v8 _$ y# P                merge_sort(data,left,mid,sorted_data);4 ]  u* c. M5 T9 l4 x" J1 L# `" z
                    merge_sort(data,min+1,right,sorted_data);
    6 n; n$ U- M* e* _- h7 |$ d: t! E" r: A                merge_array(data,left,mid,right,sorted_data);+ A  G( m1 d9 z4 D  {# s
            }( X8 f- F) q9 z
    }
    , u8 ~( D2 {( @7 C0 N8 @' bvoid merge_array(float data[],int left,int mid,int right,float temp[])//data[]即待排子数组,直接用子数组排序,但将子数组分为两部分,temp[]即临时数组
    & @- K: C& a! z4 L$ \$ y! E{" O" S& u  u$ K9 d7 D
            int i=left,j=mid+1;$ P' S& l7 p6 K0 U5 {
            int k=0;
    2 [4 I1 q% S- n# O- n        while(i<=mid&&j<=right)//循环条件,将较小数组放入临时数组temp[]中,同时i变为data[i+1]或j变为data[j+1]
    $ l" x1 N& j0 }. u        {; y) E3 F- g5 I
                    if(data<=data[j])
    , M) W9 R- L" H" }" w                {2 b4 u: L" d6 z7 d$ C' w9 c
                            temp[k++]=data[i++];3 j$ O5 F- `8 b: h) L* G
                    }6 ~6 H, X) e6 [# w- ~
                    else6 G. C8 b$ J# c5 z) K& b* ~# R* I+ A
                            temp[k++]=data[j++];9 }6 M9 y: s( M) F9 n" L. b$ d
            }
    8 L) o5 q& p- o5 y, A        while(i<=mid)//以下两个while代表可能出现的特殊情况:i/j所在数组已经全部完成排序,但另一数组仍有>=1的元素未放入临时数组中3 t# |' x; T* p. U# r! G
                    temp[k++]=data[i++];; J( s* D4 t& @
            while(j<=right)
    ) |) I2 @/ p$ C) Q8 S# i                temp[k++]=data[j++];
    6 _7 A% N! v! P- [4 |( }        for(i=0;i<k;i++)//将临时数组中的元素全部放入原数组中,k=right-left,k代表了数组长度/ h1 F8 o! ~' k  w; ]0 Z- J
                    data[left+i]=temp;
    3 c0 C0 ~' o7 u0 W4 p( Q}7 K" |$ \, O6 B7 [- ~  Z: f
    void merge_array(float data[],int left,int mid,int right,float temp[])//哨兵简化3 E9 c* g% ]6 t( ^3 w! J3 L4 t
    {; c/ ~7 K: f1 g9 x3 T+ |
            int max_num=INT_MAX;
    - K9 z  p! Y: e        int len=right-left+1;6 N- M) R9 D+ L( k
            int data_left=new int [mid-left+2];
    , B% s) Q( u# h5 c$ {" P        int data_right=new int [right-mid+1];
    6 N* \+ Z8 j" k% d        int i=0,j=0,k=0;! k; S+ t. @: i2 d' N
            for(int k=left;k<=mid;k++)% h3 t0 L8 {$ X: q" ^" a7 j
                    data_left[k-left]=data[k];
    * \1 i: E2 F+ G' X. Z        data_left[k-left]=max_num;( `3 Q0 U9 U  W/ L' j% C1 n: y" p' G
            for(int k=mid+i;k<=right;k++)
    - T# c* f  D* p6 M0 C5 ?                data_right[k-mid-1]=data[k];
    * x5 d! n4 G" \" m        data_right[k-mid-1]=max_num;8 L5 e6 V0 y5 W
            for(int k=0;k<len;k++)9 z% c1 c- f1 e1 h2 X* B" K( l- h
            {8 r; X/ E- |' @
                    if(data_left<=data_right[j]): t6 [+ x4 _5 C, V+ G: y3 E
                            data[k+left]=data_left[i++];1 ^. n& s2 F5 R  V
                    else
    6 P. c0 N; x) d" L" l9 y                        data[k+left]=data_right[j++];. b1 U* X- W  O4 b- a& d4 @3 U
            }! o6 n" _8 n5 `. K- }# j0 b+ U1 _
    }7 m1 |8 R, q, Q0 ]1 L& h4 \1 O

    ' p) q4 N2 @6 \7 x0 k5 I( |: {: Z, F7 S; @  d
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    涂真锦        

    1

    主题

    2

    听众

    141

    积分

    升级  20.5%

  • TA的每日心情

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

    [LV.5]常住居民I

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

    收藏,必须收藏啊
    ) K# G/ C% o& S! v4 _5 M' g( F$ E

    点评

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

    使用道具 举报

    1178

    主题

    15

    听众

    1万

    积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    涂真锦 发表于 2021-11-29 17:54
    5 n3 @9 R  B6 {- A收藏,必须收藏啊

    5 K4 m5 _5 o* Q4 P3 M+ J点赞
    % I- O( d/ z) V8 a. A" a
    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-6-4 04:57 , Processed in 0.903082 second(s), 62 queries .

    回顶部