- 在线时间
- 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语言3 H6 O) H9 }/ T+ u" D3 M- ~
直接插入排序法 原理:从无序数列向左遍历,从有序数组向左比较
. `1 C; m7 ]6 X, j//插入排序法
4 B9 O8 p' w1 M) [4 ~1 [# wvoid straightsort(int*arr,int len)
6 ^! h& \' y5 i{) Z& A6 {2 S' f( h, b# E
int temp,i,j;
I* G! o; j. a. C- [9 @# O for(i=1;i<len;i++)//将首元素看成有序数组,i=1表示从第二个元素开始排序$ r) n0 ~/ ^* M! h; M, |
{! m' s, `8 b( J
temp=arr;//temp存放待插入元素1 ?' R; c/ [4 O: `. L: y
for(j=i-1;j>=0&&arr[j]>temp;j--)//待插入元素向左比较,arr[j]代表已经排序的有序数组,满足j>=0,且arr[j]>temp
8 C2 o+ k* Y! m/ a' L% K {
6 f* e3 j! l( w& T5 |8 S arr[j+1]=arr[j];//若条件成立,则将已排序数组向右移位,arr[j]最大可达arr处,即temp处: b$ D/ ?/ ?0 T
}; \% o, c: N' c7 r
arr[j+1]=temp;//当循环不成立或循环终止,此时arr[j]<=temp(或j=-1,所有有序数组都大于待排元素,)temp应位于arr[j+1]处,j随temp左移而发生变化(减小)' n& N/ s" Z5 N" `
}
+ }; z% U: e2 {% j} Q* M. p6 g; O3 _- n8 b
$ ?% t7 w1 M2 g6 [
归并排序法 将一个数组从中间分为两部分,再分别对两部分进行排序(递归),最后将排好序的两部分对比合并 % {0 d( P8 D4 U
//归并排序法$ {' ~2 i5 A7 g4 H1 ]
void merge_sort(float data[],int left,int right,float sorted_data[])$ \' P$ ^$ p- }
{; _" y1 x% z5 A& w
if(left<right)//排除原数组出现只有一个数据的情况(left=right)
* b, }! f% J# u O( w: @7 h {/ Z) {% |- Y5 R( H$ d: V9 g4 Y
int mid=(left+right)/2;4 J6 c$ A K/ n& {: U! C) D6 p
merge_sort(data,left,mid,sorted_data);
9 o+ v7 P8 ^/ h$ R7 M4 v% N# K merge_sort(data,min+1,right,sorted_data);' G& F! p8 \: x9 t* e
merge_array(data,left,mid,right,sorted_data);: z1 @& w7 k+ c" _3 \$ }6 Q) j
}
8 A1 d2 T! I( ~) l& [}
8 P7 ^0 L j2 y( I" zvoid merge_array(float data[],int left,int mid,int right,float temp[])//data[]即待排子数组,直接用子数组排序,但将子数组分为两部分,temp[]即临时数组! v! T( s: |, Q9 K1 ^
{8 I2 v. R0 w6 {5 {
int i=left,j=mid+1;% [# o' k) x5 o
int k=0;& q8 c6 M2 d+ i( H! H- \
while(i<=mid&&j<=right)//循环条件,将较小数组放入临时数组temp[]中,同时i变为data[i+1]或j变为data[j+1]
) U! a9 b9 k; e, I) J3 H: _ {" `7 C" m9 ]" C
if(data<=data[j])% r* Q9 _5 u" }! `" F1 |
{
v4 d! G# g% }" D6 u5 d* c8 q temp[k++]=data[i++];' q! }, Y* F2 E5 R& a( z6 P9 A! o9 u R
}
B# P, \. a) N. P% t else
2 ?: B" n, h% t) G5 V# C; N$ V' C% x& o temp[k++]=data[j++];4 [$ C, J k( p$ _5 P4 U3 }0 |
}
# b& F4 m) {: w/ o8 [" z o while(i<=mid)//以下两个while代表可能出现的特殊情况:i/j所在数组已经全部完成排序,但另一数组仍有>=1的元素未放入临时数组中
9 U9 U# z1 W& b; M temp[k++]=data[i++];* L! b2 T% |2 d% [& W
while(j<=right)! e# q! w% C2 a2 |- I5 q
temp[k++]=data[j++];9 f% w6 V! t# Y4 O' q1 L/ K
for(i=0;i<k;i++)//将临时数组中的元素全部放入原数组中,k=right-left,k代表了数组长度6 n1 @' ^# B5 j4 f
data[left+i]=temp;
7 z# s) v! Q) V}
2 C% O' X! l& A+ V5 i" Vvoid merge_array(float data[],int left,int mid,int right,float temp[])//哨兵简化
" G& J# I7 i/ l0 d1 T. I- T& O# }{* R7 O# G1 s) S% ]
int max_num=INT_MAX;
8 }3 }/ K/ D" m int len=right-left+1;) K V" M+ U* `" I: ?
int data_left=new int [mid-left+2];
- [ Y. C% t1 x int data_right=new int [right-mid+1];& T$ @ e( L. q4 ^" d+ |% P
int i=0,j=0,k=0;
) X7 d1 J, K/ R: b4 J7 ^3 L for(int k=left;k<=mid;k++)
! g# Z9 Q6 ?# ^; T9 g1 z" m data_left[k-left]=data[k];# l. t) u' H0 I0 q& e
data_left[k-left]=max_num;. g; \9 ?# @ z
for(int k=mid+i;k<=right;k++)
k; _8 Q# W$ g/ a$ `/ T data_right[k-mid-1]=data[k];8 c, `" J4 C( X: f
data_right[k-mid-1]=max_num;. L, c+ ?$ S- k9 U! m7 e5 a
for(int k=0;k<len;k++)1 D; |, v; r# K2 x; V5 m
{
% {5 | z9 R+ \; S; Q1 H# \0 D& a. T8 i if(data_left<=data_right[j])
2 v5 I$ U) c* o5 N( n0 l data[k+left]=data_left[i++];
2 M) [; ~* u/ z3 D else4 ]2 q T- i" n0 o% l7 D
data[k+left]=data_right[j++];, i, W8 w5 s/ C5 J, f
}
% p9 W/ i# b/ C1 |3 T}* N9 X- p+ q# W- D4 ]! E
6 }4 j4 ^% u9 a$ K# b& U& N1 q% t
8 N5 X9 S! N [7 a5 T( T+ a |
zan
|