- 在线时间
- 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语言
& y" i) z6 R& p1 a; s) K直接插入排序法 原理:从无序数列向左遍历,从有序数组向左比较
. J! [$ M9 k* M' g//插入排序法 ]! s* y1 t' G9 Q, `# B
void straightsort(int*arr,int len)' X6 f2 D7 }2 V- S' Q5 J1 ~9 ]
{- I1 n% m! S+ M! V" c
int temp,i,j;& ?4 b$ Y& c( n$ e
for(i=1;i<len;i++)//将首元素看成有序数组,i=1表示从第二个元素开始排序
- b$ {7 k; v$ v2 K {. [$ l* w& j% q
temp=arr;//temp存放待插入元素* W5 k' d, ~& a0 J0 m8 Q
for(j=i-1;j>=0&&arr[j]>temp;j--)//待插入元素向左比较,arr[j]代表已经排序的有序数组,满足j>=0,且arr[j]>temp
( t# r+ {6 R2 N8 ^* ]$ b! B+ L {
# K% o) a0 u5 @3 o8 g! b& n arr[j+1]=arr[j];//若条件成立,则将已排序数组向右移位,arr[j]最大可达arr处,即temp处1 _ {5 W; C& J8 D x) v/ b
}: x# v3 C; T; `
arr[j+1]=temp;//当循环不成立或循环终止,此时arr[j]<=temp(或j=-1,所有有序数组都大于待排元素,)temp应位于arr[j+1]处,j随temp左移而发生变化(减小)
# Q1 ?4 T- p& o z& x }' a( y# }: n; V9 g- D8 v9 L3 y
}
" L8 |& e- r+ a) r# {' E# }. n4 {- S8 Z# H% c6 A% u3 e1 G+ F
归并排序法 将一个数组从中间分为两部分,再分别对两部分进行排序(递归),最后将排好序的两部分对比合并
% a q2 g, p3 B( j. X5 O+ U//归并排序法
: I- f9 N, r1 R1 Y2 r# H) _void merge_sort(float data[],int left,int right,float sorted_data[])
1 h& C& l& Z# W5 O# W{
4 V7 h" C& e# s* W& d+ M if(left<right)//排除原数组出现只有一个数据的情况(left=right)
, j$ x# A( m, Y! B$ N2 m1 ~ {
3 _! |6 ~ B L3 h int mid=(left+right)/2;
0 z! |4 V/ H' U/ z merge_sort(data,left,mid,sorted_data);
7 u: [2 n& Z2 {& n merge_sort(data,min+1,right,sorted_data);
7 O! I+ m5 v1 K$ T; \ merge_array(data,left,mid,right,sorted_data);4 I' ]& _3 C [4 K9 n
}9 _0 ~4 r# V6 ~
}! |0 i% H$ \" M. P% k9 |/ I
void merge_array(float data[],int left,int mid,int right,float temp[])//data[]即待排子数组,直接用子数组排序,但将子数组分为两部分,temp[]即临时数组2 B3 P% G6 q/ X1 d. i. X( b+ P% Z
{& A6 b4 o8 }" O
int i=left,j=mid+1;- i* @, H: R! ?* p+ w4 i. q
int k=0;# [' D0 v! b* d. t/ f9 R" G) @
while(i<=mid&&j<=right)//循环条件,将较小数组放入临时数组temp[]中,同时i变为data[i+1]或j变为data[j+1]% u9 D) @" f9 X8 B* q! M
{ }* Q3 A2 S+ c) l* Q; v
if(data<=data[j])6 u9 B0 X6 t" D
{' ]# y h" Z5 J% y% `
temp[k++]=data[i++];& `7 k: H( m. x* O. N$ Y! v3 q, _) ^
}
+ Z4 D- N! P, Z4 f$ \( x( f else7 \8 K/ j0 L7 h( ^/ s
temp[k++]=data[j++];& G+ `, l& R) P7 ~/ l1 C
}
0 m7 h3 Y/ c- c! j$ I4 K* {* n# R5 r while(i<=mid)//以下两个while代表可能出现的特殊情况:i/j所在数组已经全部完成排序,但另一数组仍有>=1的元素未放入临时数组中: J' z" f0 T! C" G1 r4 S4 H
temp[k++]=data[i++];/ @2 g1 n" C _- J0 _4 S$ w
while(j<=right)' Y/ X9 X m! s& B4 f
temp[k++]=data[j++];
- p8 G# u8 ~6 G, D* @& z for(i=0;i<k;i++)//将临时数组中的元素全部放入原数组中,k=right-left,k代表了数组长度
5 V+ ]" u, }# @5 A6 N% J- Q, U data[left+i]=temp;8 n1 V2 \& t. e% l$ K# j) k
}
/ h* K+ k1 \' J0 n2 r4 Y) k0 ~' P' uvoid merge_array(float data[],int left,int mid,int right,float temp[])//哨兵简化
" r* p* z C% ]{
6 A r w$ R+ m ~) a8 i int max_num=INT_MAX;
/ e+ `9 m7 Y4 X0 j* N4 ]' H5 s int len=right-left+1;
/ c. p7 F+ C! u N( C& u int data_left=new int [mid-left+2];& F- o! T4 ]6 g& Y
int data_right=new int [right-mid+1];
4 X0 ?' J3 r4 n. u2 ~ int i=0,j=0,k=0;- O8 m) \+ n6 I2 j: d
for(int k=left;k<=mid;k++): Q8 P% D, C, X5 f" ~# E0 S7 W' l, T
data_left[k-left]=data[k];
% m. M6 m0 v+ L F/ P data_left[k-left]=max_num;8 D% U+ s6 N) ^3 x% s
for(int k=mid+i;k<=right;k++)
0 F+ i( l* P9 m9 m6 }' o9 Z data_right[k-mid-1]=data[k];
% G2 t1 W# e- Y) i+ W8 u data_right[k-mid-1]=max_num;
/ `. l) b7 u5 [1 P0 c2 C% _ }( _ for(int k=0;k<len;k++)
: {$ Z# c0 P8 M! [ {
) q# h0 i4 X/ L8 E/ ]8 s/ v if(data_left<=data_right[j])( @$ i- @& ?8 E' a* x/ W
data[k+left]=data_left[i++];$ ]& {3 y4 X3 e( c
else
5 V7 c! t$ u: l7 ?7 k. Y- ~8 N& w data[k+left]=data_right[j++];1 y8 F1 x5 l+ }" c7 G
}
( T/ U' M( m- p; ^1 A}4 Q) u* p& g U
' t. T+ J# X c
4 y, h# M; ?8 g% r G/ y: { |
zan
|