- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40219 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12777
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
无C不行,废物一个,算法导论:C语言, E# V% w6 g6 B+ S6 V( _5 `( R
直接插入排序法 原理:从无序数列向左遍历,从有序数组向左比较 $ \3 J0 M! q+ [
//插入排序法( W5 A/ q! v; ^( w5 V r$ @5 C
void straightsort(int*arr,int len)& ~: x# V/ l' s
{
: o& L- g1 b) E9 t* } int temp,i,j;
( _ z9 `$ s. D7 B1 D% g, ^3 }/ Z7 | for(i=1;i<len;i++)//将首元素看成有序数组,i=1表示从第二个元素开始排序
$ i! l6 J [1 L, n2 m4 |2 I {( ]( ~+ W+ u7 S( K
temp=arr;//temp存放待插入元素0 I2 |% g/ V# R% c% d
for(j=i-1;j>=0&&arr[j]>temp;j--)//待插入元素向左比较,arr[j]代表已经排序的有序数组,满足j>=0,且arr[j]>temp
" _- C9 E+ p+ N7 V% F6 D. o {' T1 H2 z* R0 W1 b8 ]
arr[j+1]=arr[j];//若条件成立,则将已排序数组向右移位,arr[j]最大可达arr处,即temp处/ j4 r" R8 @ c' |2 h# Q! U- F: X' `
}% X) W) t1 T. @& Z
arr[j+1]=temp;//当循环不成立或循环终止,此时arr[j]<=temp(或j=-1,所有有序数组都大于待排元素,)temp应位于arr[j+1]处,j随temp左移而发生变化(减小)
$ M, S, ^- g$ ^) ^ }
0 c& r6 v2 W, s7 R}
" x( |, ]0 S4 ]( k6 ]. s( h( G$ L& O0 }/ a# z+ e5 p# F
归并排序法 将一个数组从中间分为两部分,再分别对两部分进行排序(递归),最后将排好序的两部分对比合并
7 d* l7 S* S& T! l7 I \6 _//归并排序法5 [2 b, H* Y/ N: ]4 q0 J
void merge_sort(float data[],int left,int right,float sorted_data[])
5 U; |- o9 \# Z$ b4 I. Y{9 L4 M, g7 C) ?: ~- i8 P
if(left<right)//排除原数组出现只有一个数据的情况(left=right): ?% V- `' W9 b `2 M, U
{
$ \6 S) @4 x9 ]5 l5 z* s- T$ U int mid=(left+right)/2;
; \( {* ^& r0 j0 k merge_sort(data,left,mid,sorted_data);
7 }( V& x! g! C) u# H, E( ` merge_sort(data,min+1,right,sorted_data);5 u& L# v4 c% v( G3 q# [
merge_array(data,left,mid,right,sorted_data);
% A. Y, N* z; h, [) ~8 z }
+ G$ X7 s; `* q4 z7 j}: d) I8 L2 i$ ~& X: N
void merge_array(float data[],int left,int mid,int right,float temp[])//data[]即待排子数组,直接用子数组排序,但将子数组分为两部分,temp[]即临时数组
! q3 l# X7 h% Z, G, f{2 `0 e2 P! U9 Y/ E; \
int i=left,j=mid+1;0 P. y' i+ }! `( t, u
int k=0;/ ~1 G% t* O6 H8 S1 K
while(i<=mid&&j<=right)//循环条件,将较小数组放入临时数组temp[]中,同时i变为data[i+1]或j变为data[j+1]
- `! w; i$ ~. X# w) a3 I& O {
! i+ P/ g) L; f- B- X7 w" o! M if(data<=data[j])
. b6 K$ [ y, q* x* O) M {
8 p0 M3 L# T8 X& \% n0 @" \- h temp[k++]=data[i++];+ G- R! {' m8 k! v- s/ N
}! S. r; u4 I6 E* z/ l
else3 D* ^, L1 J* f
temp[k++]=data[j++];* }9 e) W2 c! l4 R
}
5 e+ v3 z0 p* @- L9 G$ a' k while(i<=mid)//以下两个while代表可能出现的特殊情况:i/j所在数组已经全部完成排序,但另一数组仍有>=1的元素未放入临时数组中& x/ M. I( l( P: l
temp[k++]=data[i++];
3 u) A! A+ N/ _$ K! B, ? while(j<=right)
& d* `8 d# U3 S4 m. p temp[k++]=data[j++];4 N& M; x+ m8 z4 O% s; n6 U" P- {
for(i=0;i<k;i++)//将临时数组中的元素全部放入原数组中,k=right-left,k代表了数组长度
# Z4 S, T( [$ }* E+ a; v! m8 C4 E: Y data[left+i]=temp;4 w5 x! X& n9 X
}" V$ Z L0 S0 K/ k3 ~% \6 {
void merge_array(float data[],int left,int mid,int right,float temp[])//哨兵简化
$ _! m/ }: b$ J{
y* I1 s2 p* ]( Z int max_num=INT_MAX;1 ^% l+ p7 S( L0 G3 S ~
int len=right-left+1;
~# u5 M1 P+ h4 K% U, x$ Y1 X- f int data_left=new int [mid-left+2];# G$ l. G; S, J% t
int data_right=new int [right-mid+1];4 W: ^) \: d; y
int i=0,j=0,k=0;- d- t; b& c- `
for(int k=left;k<=mid;k++)
: P. V+ ~* P4 Q3 [! S0 x data_left[k-left]=data[k];% ]+ y0 T' m- b; H3 g/ v3 Y3 ?
data_left[k-left]=max_num;
; q4 D- L' i0 _ for(int k=mid+i;k<=right;k++)
$ A: V6 [6 e9 O- t/ b" C data_right[k-mid-1]=data[k];
, \. g8 M1 z4 z$ } data_right[k-mid-1]=max_num;# |* V1 y0 H" T2 Y" h3 G
for(int k=0;k<len;k++)
+ e0 u* d% @) _ Z {( b) p, C6 c; E1 v& [
if(data_left<=data_right[j])/ f) S1 e' H/ |
data[k+left]=data_left[i++];
2 U% C3 p! f5 v& j0 Q5 G else) o# ^: F3 x* E! {: `
data[k+left]=data_right[j++];
~' \' \3 I0 j$ X! K) E* R% | }
$ f: g0 ~) W! N, @& Y}$ k- o3 k% O# r$ v
/ z4 f5 M b: X9 P4 h: @1 X- \+ |" ]; S L+ l0 L1 p
|
zan
|