- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40357 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12818
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
无C不行,废物一个,算法导论:C语言
1 _/ P9 U5 X2 f' d直接插入排序法 原理:从无序数列向左遍历,从有序数组向左比较
) X& h! c2 y+ Z0 h) g' P//插入排序法) \: |5 u" k y$ a' N
void straightsort(int*arr,int len)& J# t& a7 [: a
{
1 y3 w# u. A2 C( k+ | int temp,i,j;8 F5 F5 R) [; `8 C8 J) }, z6 s1 n
for(i=1;i<len;i++)//将首元素看成有序数组,i=1表示从第二个元素开始排序
9 F1 Z2 b3 Y# s4 K2 b. a: Q5 A7 f& x {
, Y5 i6 m/ P9 @ A4 S, s temp=arr;//temp存放待插入元素
; U! I7 [9 P+ C for(j=i-1;j>=0&&arr[j]>temp;j--)//待插入元素向左比较,arr[j]代表已经排序的有序数组,满足j>=0,且arr[j]>temp1 J1 D F* n9 `2 T% x+ x$ l
{
}+ E# v3 g7 @, v arr[j+1]=arr[j];//若条件成立,则将已排序数组向右移位,arr[j]最大可达arr处,即temp处2 R; |' }# g1 ^+ s" j
}
, g I; D( T7 D# u4 x arr[j+1]=temp;//当循环不成立或循环终止,此时arr[j]<=temp(或j=-1,所有有序数组都大于待排元素,)temp应位于arr[j+1]处,j随temp左移而发生变化(减小)
8 t B" g0 l+ P2 F& q3 Y9 f }$ F% n) q4 {3 M( J! ^
}* Z9 I w2 S- }5 N+ u
7 E8 @& [" M# j, K8 [
归并排序法 将一个数组从中间分为两部分,再分别对两部分进行排序(递归),最后将排好序的两部分对比合并
- s0 r' L. O* l* g//归并排序法& p# b. ?$ e r8 c
void merge_sort(float data[],int left,int right,float sorted_data[])- @7 G2 z0 k8 Z/ O' X/ {
{( A. \! j, m: C* Q* K7 X
if(left<right)//排除原数组出现只有一个数据的情况(left=right)
$ y- S1 H# Y5 u# v% \ {2 m: j( m. X% S! D! n
int mid=(left+right)/2;
2 a( K: J! g. T2 U merge_sort(data,left,mid,sorted_data);
# p. @' g3 t, ]/ O2 n; c% u merge_sort(data,min+1,right,sorted_data);# P4 B* C2 s0 T* S
merge_array(data,left,mid,right,sorted_data);, k% r+ S5 C; E; E- Y
}6 y8 ]; R3 O) h
}% V7 h( E& ~) H- k/ A+ H$ H
void merge_array(float data[],int left,int mid,int right,float temp[])//data[]即待排子数组,直接用子数组排序,但将子数组分为两部分,temp[]即临时数组7 {8 {1 ?+ } G! o/ j; a) g
{
! p: t$ g- t+ E E( g, x' j3 G int i=left,j=mid+1;
# m. O( y) N& ^6 V* { int k=0;* }( g5 A; v. A9 Q4 F9 Z& `1 j
while(i<=mid&&j<=right)//循环条件,将较小数组放入临时数组temp[]中,同时i变为data[i+1]或j变为data[j+1]( }' k6 L2 q& x$ S; E, s- J, C% `4 C
{& `3 j, x" Q8 a; s
if(data<=data[j])
; F% v) `3 ?0 V {, R$ V7 i6 r0 t3 z( N k z
temp[k++]=data[i++];
& |$ I4 ^1 F$ U9 ` }
/ f) V2 O9 f! | else
: D+ b ]$ H. X5 @2 N) b4 V$ _ temp[k++]=data[j++];0 Z( W( y5 ^* ^5 Q5 S- j
}
5 e8 g# A8 p7 {2 C9 ^, J. D7 r ]+ b while(i<=mid)//以下两个while代表可能出现的特殊情况:i/j所在数组已经全部完成排序,但另一数组仍有>=1的元素未放入临时数组中; n4 \( ^( `9 W, E
temp[k++]=data[i++];
5 Z+ {2 i3 I- [/ l7 @ while(j<=right)) T. \/ Q0 o: Q0 \, C* f+ D5 f' _
temp[k++]=data[j++];
- `0 _3 R3 o7 K- y0 f9 w6 d$ i$ s for(i=0;i<k;i++)//将临时数组中的元素全部放入原数组中,k=right-left,k代表了数组长度: k3 ^& Y q, k# p' B
data[left+i]=temp;1 z2 W" O7 M3 F8 g0 Q7 d
}+ z: h4 v* p Z3 {$ L7 L/ I. I
void merge_array(float data[],int left,int mid,int right,float temp[])//哨兵简化 f% B6 E: R- i
{! t. {0 p: b7 I$ S* T
int max_num=INT_MAX;
+ L- g/ z: Q# W" u9 E" [" O int len=right-left+1;
$ h! \/ \, j; u/ N9 J7 m/ S int data_left=new int [mid-left+2];
7 E+ D& q" h. f+ K, f+ I/ j/ O0 o ~ int data_right=new int [right-mid+1];
/ t, O0 J$ R |. V0 ^7 J int i=0,j=0,k=0;& T5 ]) w1 f* d: F+ [: U/ f
for(int k=left;k<=mid;k++)! |' \ e% w5 Q* a9 I2 T) ~
data_left[k-left]=data[k];
0 g5 |# }& t9 @. R4 i+ _5 @0 S. ]8 p data_left[k-left]=max_num;1 w/ w/ Q) n$ p- J0 `4 E6 c
for(int k=mid+i;k<=right;k++)
& f5 I" e+ \0 g4 g J5 s data_right[k-mid-1]=data[k];
! n% f. N4 S' x) r, W+ ~5 a& {* q data_right[k-mid-1]=max_num;
- B. M' @+ t0 O# ]% V$ l for(int k=0;k<len;k++)3 R% S/ z6 ^ ^ I+ {+ r
{3 B2 _& x' p0 g: H# }
if(data_left<=data_right[j])* ~/ K8 s- [# Q3 W% }
data[k+left]=data_left[i++];
0 [( i$ c# P8 S6 A# N( M3 w% g else
8 `/ w# k# m; f data[k+left]=data_right[j++];; w2 F$ \) W/ K& j# k+ m- t
}; b0 u0 O0 u) I. F% |
}' e3 i* S3 w% m+ f
3 s1 C6 k& Z* X: T, ^: Z' n
/ D! z9 D1 p9 Y. W- v4 F
|
zan
|