- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40345 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12815
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
无C不行,废物一个,算法导论:C语言
5 @ f: ^1 `: E. m3 x" @直接插入排序法 原理:从无序数列向左遍历,从有序数组向左比较
$ n7 c+ B/ Y$ {# ?//插入排序法
' m* n/ J; c& z7 W6 i5 p Q% {void straightsort(int*arr,int len)! V( H. t9 M- K/ V" g! M
{/ {/ `! G9 N& Z- d3 d
int temp,i,j;
, F I% {/ }) Q5 a for(i=1;i<len;i++)//将首元素看成有序数组,i=1表示从第二个元素开始排序& [, C3 c2 | ` K5 U) O! @
{
. m* H5 R( v0 P5 L0 B temp=arr;//temp存放待插入元素1 k7 c5 o w/ u
for(j=i-1;j>=0&&arr[j]>temp;j--)//待插入元素向左比较,arr[j]代表已经排序的有序数组,满足j>=0,且arr[j]>temp
" t1 T' d0 o, m' }0 h& d {8 D" C9 H+ j' [( E. @; c
arr[j+1]=arr[j];//若条件成立,则将已排序数组向右移位,arr[j]最大可达arr处,即temp处
9 ?/ P% B0 a6 w" \9 n }( N% ]7 [: p8 G) j9 P+ z
arr[j+1]=temp;//当循环不成立或循环终止,此时arr[j]<=temp(或j=-1,所有有序数组都大于待排元素,)temp应位于arr[j+1]处,j随temp左移而发生变化(减小)
C# M9 Q6 v' e* `+ O$ w }
+ U% {1 I' R9 D% Q4 z7 z2 R- }}
" N: |" l% J: P1 M3 b7 H& s- q0 u# @9 ?0 L# m/ [1 i
归并排序法 将一个数组从中间分为两部分,再分别对两部分进行排序(递归),最后将排好序的两部分对比合并 2 H" y/ |% U1 F" h* E
//归并排序法8 y; x$ P% R& F% D. @
void merge_sort(float data[],int left,int right,float sorted_data[])
' j7 t2 J) R; w8 I4 {3 ]8 B{: C( n# s4 ?2 A( e0 j. Q
if(left<right)//排除原数组出现只有一个数据的情况(left=right)6 W! T# `7 Z- N1 l
{, j( c; L! R* z! n y
int mid=(left+right)/2;( H# J# q, H( X
merge_sort(data,left,mid,sorted_data);
" Q! T! b0 ?- g8 g& y, H/ s% _ merge_sort(data,min+1,right,sorted_data);: q9 B1 ?3 }% f" A8 L
merge_array(data,left,mid,right,sorted_data);
+ W% k8 g+ q' i& f! _, }6 B }
* T6 v; g I8 f, }( H}- `& [) w+ s% x Z
void merge_array(float data[],int left,int mid,int right,float temp[])//data[]即待排子数组,直接用子数组排序,但将子数组分为两部分,temp[]即临时数组- R2 J( j: m7 {4 }, T; A: z
{5 Z5 \, F. H- f6 w0 m7 j
int i=left,j=mid+1;
9 K2 K8 V8 w# w' Z int k=0;
; q- f' R! ~% V. s( v, z7 c while(i<=mid&&j<=right)//循环条件,将较小数组放入临时数组temp[]中,同时i变为data[i+1]或j变为data[j+1]# V- S( \! E: Z @9 R; J) y# u
{6 f! x& H9 g5 B) L! S- P. J4 s$ q
if(data<=data[j])
9 Q" U* _: @- Q {% ~; z5 R: l) t. Z1 z' s% f
temp[k++]=data[i++];) W3 Q( C/ J/ R) U% x8 t
}
& z' |/ K3 [' k4 y else
' C: v& R5 B6 k" O: ]( ?& K! m temp[k++]=data[j++];( i) d# Q3 ~7 B
}; [: Y# ]& y) J' x
while(i<=mid)//以下两个while代表可能出现的特殊情况:i/j所在数组已经全部完成排序,但另一数组仍有>=1的元素未放入临时数组中
- `, f* N! Z2 \/ I' L; Q9 i0 X temp[k++]=data[i++];& H @8 P; m/ J; ` Q1 T4 c0 I. ?7 W
while(j<=right)
; F+ [' `8 k' J. q: t# b7 Y temp[k++]=data[j++];
" Y1 O$ o" g% }' } for(i=0;i<k;i++)//将临时数组中的元素全部放入原数组中,k=right-left,k代表了数组长度! n! a+ I" B2 [$ m6 g
data[left+i]=temp;3 Z# o- s3 u6 m* z( H" c$ n
}( R: g. W* @( M3 @! e6 T5 q; s
void merge_array(float data[],int left,int mid,int right,float temp[])//哨兵简化
! C' ?, a( D3 e' t% ]- p: V{; r/ S+ |! F) [. P1 i
int max_num=INT_MAX;4 y0 j& P4 v( p* d
int len=right-left+1;
. _+ B% H- I9 T0 R& J int data_left=new int [mid-left+2];, c2 i L2 g. L9 d: v
int data_right=new int [right-mid+1];
c, \0 b' x; t; f* f$ x int i=0,j=0,k=0;
( T$ N E A. W! x: ?1 N0 i for(int k=left;k<=mid;k++)
1 w5 M: X& }$ p5 ~# G data_left[k-left]=data[k];. E1 y* { A2 X% x% `7 N* h8 y w0 D
data_left[k-left]=max_num;
5 D9 h: F, f+ R for(int k=mid+i;k<=right;k++)
* Y8 y5 B6 x8 B data_right[k-mid-1]=data[k];
- g4 m! T) Y& ~7 y+ t( p/ [$ i data_right[k-mid-1]=max_num;
/ J k& H% j9 B* M1 }& c5 }: f; [ for(int k=0;k<len;k++)
1 s7 g: U; A1 v9 I" Y {
# Y% y& k2 v C% c' d5 k; {6 ` if(data_left<=data_right[j])
* ?8 N( p7 b% k6 X" y0 G data[k+left]=data_left[i++];
& x0 K9 i; ]; {7 S$ Y% K6 K9 U" ` else
$ C3 _7 l$ i/ N' g2 D h data[k+left]=data_right[j++];
( `" O) V0 r' D! M' ^2 a! H* _ }( X9 I" D& {9 C! e9 x0 h0 ?
}
; I- y" t% B* G9 N8 m4 A0 O* a
0 @7 }% I u( H
& f+ |2 H0 H, M3 k9 y7 _ |
zan
|