- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40293 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12799
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
无C不行,废物一个,算法导论:C语言
4 V3 s% }/ n2 ^: ~直接插入排序法 原理:从无序数列向左遍历,从有序数组向左比较
: ~- H" }, H0 d; s6 w//插入排序法5 b( i) V9 g, k# {% k1 N
void straightsort(int*arr,int len)
) o5 j6 v' u! i& D/ t( Z9 g4 j! W{/ G# o+ ]1 c! E1 I
int temp,i,j;" [8 C# R6 X# O9 P. N
for(i=1;i<len;i++)//将首元素看成有序数组,i=1表示从第二个元素开始排序( Y, W1 `$ I! i, l7 a$ R
{
8 ^6 A8 h7 \" ` temp=arr;//temp存放待插入元素
6 ~0 g3 \5 ]9 S; V0 a8 Y0 Y for(j=i-1;j>=0&&arr[j]>temp;j--)//待插入元素向左比较,arr[j]代表已经排序的有序数组,满足j>=0,且arr[j]>temp
9 E( Y, T% s. l7 s! c0 g: v {9 n D- N9 B3 N
arr[j+1]=arr[j];//若条件成立,则将已排序数组向右移位,arr[j]最大可达arr处,即temp处( O( i" ~; ^2 j, a3 W
}
p4 c0 f% S2 i+ f; X8 h% _ arr[j+1]=temp;//当循环不成立或循环终止,此时arr[j]<=temp(或j=-1,所有有序数组都大于待排元素,)temp应位于arr[j+1]处,j随temp左移而发生变化(减小)$ S% i7 T& i9 f) r; ~' D
}: K: C7 z* {6 ]( [; s V2 z- J
}9 G& C0 K1 a7 D* Y4 Z$ ^- O
: ~9 [6 i$ S# X" E: g归并排序法 将一个数组从中间分为两部分,再分别对两部分进行排序(递归),最后将排好序的两部分对比合并
9 T+ }2 v; X# E! K. \ C$ U//归并排序法
, [) b/ d0 m; r2 Pvoid merge_sort(float data[],int left,int right,float sorted_data[])
* F b. h9 t8 V1 D, a+ R{
4 i$ W& a' M4 s* Y. G3 }6 E if(left<right)//排除原数组出现只有一个数据的情况(left=right)
4 s) t" C0 `/ | o. h5 i {
# m; H: ~6 j4 p6 X int mid=(left+right)/2;
/ D8 C$ J0 _. b2 H* b4 p1 c/ E$ L merge_sort(data,left,mid,sorted_data);6 z" z2 n+ w1 l. }
merge_sort(data,min+1,right,sorted_data);. @2 Y! X7 K/ A/ H( t
merge_array(data,left,mid,right,sorted_data);
4 G) X+ i; T2 ^ @/ w }
6 N, q, _& M4 l% s3 l2 K}
! l* i, }, t3 Z/ l9 g/ {void merge_array(float data[],int left,int mid,int right,float temp[])//data[]即待排子数组,直接用子数组排序,但将子数组分为两部分,temp[]即临时数组
D! e3 u8 L% Y. {# ?1 \0 S5 m* I{
% R% |- a/ w# F2 c# q int i=left,j=mid+1;
+ l1 i; w, O7 o5 G int k=0;" R% e0 b7 s/ c+ S; t- }
while(i<=mid&&j<=right)//循环条件,将较小数组放入临时数组temp[]中,同时i变为data[i+1]或j变为data[j+1]
- |' w0 l3 _6 K, d4 ] {) N" g4 Z1 P, H$ }0 I
if(data<=data[j])
0 M6 f( n9 M2 H( ^/ ^ {, t/ ?% |) W2 q$ P
temp[k++]=data[i++];& \6 D* ?% \: p- u, b
}* x( S$ u- D$ A3 p7 h. d' _
else+ J& j) V4 p: L" S
temp[k++]=data[j++];' w3 t) o9 B v0 D( n
}# r0 f( j' g: N/ A- O- b
while(i<=mid)//以下两个while代表可能出现的特殊情况:i/j所在数组已经全部完成排序,但另一数组仍有>=1的元素未放入临时数组中7 I3 C9 Y" L8 J8 }2 T; K0 s
temp[k++]=data[i++];
' b# x# |+ o" T! k while(j<=right); u' l/ S0 L. R8 T
temp[k++]=data[j++];
. ~0 g6 O& E$ p Q, j n7 E5 C' I( Z for(i=0;i<k;i++)//将临时数组中的元素全部放入原数组中,k=right-left,k代表了数组长度2 y7 M1 t$ {; o6 T/ D
data[left+i]=temp;3 M" s/ _" {4 \* w7 w
}
" ~% f$ k' v- T7 s4 ^/ vvoid merge_array(float data[],int left,int mid,int right,float temp[])//哨兵简化; H9 N" o6 L P; C" k) h
{8 ?- r M! U0 p" r! K
int max_num=INT_MAX;" D( e. C! \6 e( p, L0 w9 t7 Z
int len=right-left+1;& e Z" E/ z) P0 G2 g
int data_left=new int [mid-left+2];0 n& e: S1 l1 n& H& p: x6 |
int data_right=new int [right-mid+1];
2 q2 L) H6 q" w! j* d int i=0,j=0,k=0;
6 z: G4 l- C5 \5 ~5 j3 V# _: A' M W for(int k=left;k<=mid;k++)
/ Y/ B+ }: C6 f$ Y1 Z data_left[k-left]=data[k];7 Z: `+ [" j' Q6 \: ~* T' u
data_left[k-left]=max_num;; U8 e- H6 {/ L# Q$ e K9 u
for(int k=mid+i;k<=right;k++)
( `% V; ^/ Z8 @) _ data_right[k-mid-1]=data[k];
6 Y4 O$ S J2 }7 ` data_right[k-mid-1]=max_num;0 I' t( E8 {, j- G4 v/ ?; P
for(int k=0;k<len;k++)4 B, k1 g, S) s: y' G$ [
{
W6 b+ _4 z, S* V/ }7 L# j if(data_left<=data_right[j])
: G z7 ^' f& t data[k+left]=data_left[i++];% o0 D- e7 l$ L% K. u
else7 G1 K, v+ h% O9 B! H5 P* i
data[k+left]=data_right[j++];5 \2 h% N H2 a3 V$ F/ e* @( Y! j+ O
}* O4 i# f A5 e0 @
}
' h1 J& I) }: i8 [
. a5 ?8 x! y+ D( a! z. s+ _* v8 Y' t/ b; p. H8 N% E
|
zan
|