数学建模社区-数学中国

标题: 无C不行-废物一个-算法导论:C语言 [打印本页]

作者: 1047521767    时间: 2021-11-28 01:29
标题: 无C不行-废物一个-算法导论:C语言
                                            无C不行,废物一个,算法导论:C语言  i' j6 h7 J& e

直接插入排序法

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


7 f9 U/ |2 [: d; o/ _2 D" k% g//插入排序法" {3 @/ B# m- _# V: G
void straightsort(int*arr,int len)
: @- _* N# X3 l% H5 k. K{
, o2 d0 {$ Q. w8 d5 l/ k# Q        int temp,i,j;( ^% h; |4 j: t: o" p  j
        for(i=1;i<len;i++)//将首元素看成有序数组,i=1表示从第二个元素开始排序' I5 _6 O2 M3 K9 W$ d
        {
' {: K( a- Y+ H- d6 j                temp=arr;//temp存放待插入元素* x# _# C- v8 ?$ q
                for(j=i-1;j>=0&&arr[j]>temp;j--)//待插入元素向左比较,arr[j]代表已经排序的有序数组,满足j>=0,且arr[j]>temp
; f7 L" T- V% w  n. r                {
: F: g' }/ \" K  s/ A                        arr[j+1]=arr[j];//若条件成立,则将已排序数组向右移位,arr[j]最大可达arr处,即temp处7 C/ V! t' @! c
                }; c; T! x2 \( s1 A2 d; O. d
                arr[j+1]=temp;//当循环不成立或循环终止,此时arr[j]<=temp(或j=-1,所有有序数组都大于待排元素,)temp应位于arr[j+1]处,j随temp左移而发生变化(减小)
( W/ Y$ t2 {5 ~  `$ v/ x& q        }
! O& i8 k; j% b  a}* r$ B$ R: f) a: m4 I+ S8 _" j

8 Y. d, W3 y( d' w- p

归并排序法

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

0 T! T& m* ~# A% Q& e7 h
//归并排序法
6 j! ~- K4 U6 Ivoid merge_sort(float data[],int left,int right,float sorted_data[])6 |' B" |# c& a( `0 e+ J
{+ j& E! l: S. H* s3 }
        if(left<right)//排除原数组出现只有一个数据的情况(left=right)
9 ?6 q8 V. c( t$ K7 I: f        {' c# h, a  ^: F$ x  Y; l
                int mid=(left+right)/2;9 l# c7 o9 u" Q: `/ @2 `# |, ^/ \
                merge_sort(data,left,mid,sorted_data);" J& H3 b' B/ n
                merge_sort(data,min+1,right,sorted_data);
' K$ Z; a" s% H# H; |( U                merge_array(data,left,mid,right,sorted_data);( C0 ]- r6 q8 Q2 u& L9 p, {& w
        }
- ?2 S8 _( {0 G  |" d, v! B}
" q1 ]: _9 S/ U1 e& F- F8 n2 K  pvoid merge_array(float data[],int left,int mid,int right,float temp[])//data[]即待排子数组,直接用子数组排序,但将子数组分为两部分,temp[]即临时数组
/ d& a7 e' K- L{
# A; |: x, v6 }0 W9 ^        int i=left,j=mid+1;
) ?3 R' T% J/ S: X: @: \2 e        int k=0;& U, E& I. w5 L0 i
        while(i<=mid&&j<=right)//循环条件,将较小数组放入临时数组temp[]中,同时i变为data[i+1]或j变为data[j+1]
( s! w$ W  n" `        {
- m# \- W+ e3 h                if(data<=data[j])& z& {! [/ U& [; j5 s" {
                {
4 `* s/ l9 {) r                        temp[k++]=data[i++];* y+ L9 ]) b6 J8 `, q
                }" Z* L/ _2 {" ?. v0 i& O% m
                else
3 ^- T8 `9 n, a2 N( e                        temp[k++]=data[j++];4 g  g( R! K6 W  r
        }- F1 q, l+ L. C
        while(i<=mid)//以下两个while代表可能出现的特殊情况:i/j所在数组已经全部完成排序,但另一数组仍有>=1的元素未放入临时数组中2 M- m5 X+ Y2 n8 a2 m# G
                temp[k++]=data[i++];# @  |! O' j# c( o! r# T
        while(j<=right)
" r+ q! B* _3 s                temp[k++]=data[j++];
! @( g/ C3 H3 Z0 m8 _' h/ T0 }        for(i=0;i<k;i++)//将临时数组中的元素全部放入原数组中,k=right-left,k代表了数组长度
5 H: F4 M: i+ {( B+ e: G, g                data[left+i]=temp;
$ u+ B$ i# x  O( _/ `$ i}. G0 S7 ]0 a, t2 q
void merge_array(float data[],int left,int mid,int right,float temp[])//哨兵简化0 Y# a5 B% ^, a! Z
{* j; }! v7 _: V+ V6 K8 t0 ~
        int max_num=INT_MAX;
0 d0 b& c% V: e0 }  L) d# P1 a# H        int len=right-left+1;
' `# V# a+ q4 e! z& `, o: i8 `& P        int data_left=new int [mid-left+2];4 R0 i6 V1 J" G% K0 ]
        int data_right=new int [right-mid+1];; i) O) }! K8 t* |! J
        int i=0,j=0,k=0;
* |. k5 a( ^: Y) Y9 T. a; O$ z0 N        for(int k=left;k<=mid;k++)
. c5 V  o6 F! A8 w3 P                data_left[k-left]=data[k];
' C# ]4 Y( f( G  E8 D% E        data_left[k-left]=max_num;* R: ?! `; L! M% M+ N$ R, p! \
        for(int k=mid+i;k<=right;k++)
$ P$ n6 o" {: a                data_right[k-mid-1]=data[k];3 ?5 M1 b3 m- x6 @# K5 E& N
        data_right[k-mid-1]=max_num;
5 N0 k$ N! |% g9 U+ n% k7 h3 Q, t        for(int k=0;k<len;k++)  v2 v  g( [! x' {  R. v: {" ^
        {: G' F7 C- k2 I, q4 M
                if(data_left<=data_right[j])
1 E+ T# L2 h$ f                        data[k+left]=data_left[i++];
8 z  A3 W; s, X                else
3 S4 Q3 v  G) X8 Q6 q, \9 C- l                        data[k+left]=data_right[j++];/ A+ S( }2 Q. e4 C, @4 U+ ~
        }" a" l8 a  t1 P- t
}
* ~, I1 @% X( e" h( w" w/ ~# z$ H9 J& O: C
( F! S4 k$ E% T  O

作者: 涂真锦    时间: 2021-11-29 17:54
收藏,必须收藏啊
6 ^' K$ B6 p) H* k, N: Y8 x
作者: 1047521767    时间: 2021-11-30 11:13
涂真锦 发表于 2021-11-29 17:54
: g, M  v& {9 e, ^# Z0 u& E( g2 V收藏,必须收藏啊
  i; h5 j& E3 F% q8 A
点赞
7 F- b2 g& B# I




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5