- 在线时间
- 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语言3 M! }. z+ d! R* ]
直接插入排序法 原理:从无序数列向左遍历,从有序数组向左比较 / s- v! R7 m3 t; a! Q, D
//插入排序法9 n: I2 {* s! m, w: r: S* L
void straightsort(int*arr,int len)+ Y8 B4 B# @/ C% Q/ H
{5 X6 f; x1 R5 J; y5 j+ [7 V* s# Z
int temp,i,j;
) G% _& `( L+ C( J for(i=1;i<len;i++)//将首元素看成有序数组,i=1表示从第二个元素开始排序
0 h# ^/ B6 ~7 r& Q3 @: Q7 L {
S- _4 f% K) r9 h temp=arr;//temp存放待插入元素
3 H1 d5 U) J( o2 d8 x( W for(j=i-1;j>=0&&arr[j]>temp;j--)//待插入元素向左比较,arr[j]代表已经排序的有序数组,满足j>=0,且arr[j]>temp
' k' E4 N. E. C c- x& z2 d# X {; x, e0 ]8 T3 s: V( M2 q/ s
arr[j+1]=arr[j];//若条件成立,则将已排序数组向右移位,arr[j]最大可达arr处,即temp处
- e0 P% H" ~! R3 } S) h }1 O' j9 J- s, n
arr[j+1]=temp;//当循环不成立或循环终止,此时arr[j]<=temp(或j=-1,所有有序数组都大于待排元素,)temp应位于arr[j+1]处,j随temp左移而发生变化(减小)
( X4 V5 Q' W6 r }
$ f0 ^+ s- R7 p% X}6 t, R" {2 ~! L" `' X
# F r* n$ Z3 q归并排序法 将一个数组从中间分为两部分,再分别对两部分进行排序(递归),最后将排好序的两部分对比合并 ( X% n) I/ Z& i* }' w$ ?9 ]) R
//归并排序法& ]$ C* s6 ?* m4 F/ Z2 Z
void merge_sort(float data[],int left,int right,float sorted_data[])
3 r f! F( Q( k X* |( |& T I{0 _3 O5 @ |2 K+ P& ~/ L1 N
if(left<right)//排除原数组出现只有一个数据的情况(left=right), }! D, B8 |1 g
{' H9 m+ `1 f6 S# f- F
int mid=(left+right)/2;* {' v% w( x% B. M8 k$ N9 I
merge_sort(data,left,mid,sorted_data);, J* B+ h) X" t8 |$ L
merge_sort(data,min+1,right,sorted_data);
, I, |* A- @) }% ^6 |3 [ merge_array(data,left,mid,right,sorted_data);) p" [* \5 o9 x: R8 `
}% N9 d7 ?' q5 L; B: v
}+ M/ n8 D( _: H5 \
void merge_array(float data[],int left,int mid,int right,float temp[])//data[]即待排子数组,直接用子数组排序,但将子数组分为两部分,temp[]即临时数组3 A! h8 x4 \$ _% d4 `
{, q! d% g3 c4 F0 Q' a- E7 Q4 ]8 {
int i=left,j=mid+1;
. @% t" i2 L5 L4 s. s. J* | int k=0;/ O' y+ O( _: F# ~# X
while(i<=mid&&j<=right)//循环条件,将较小数组放入临时数组temp[]中,同时i变为data[i+1]或j变为data[j+1]( x, a; J$ x- M" Z, R; `. f
{% z* h' ]& _$ p" _. L! S/ h3 L3 r# X+ K
if(data<=data[j])# E7 t, Q! g% ?3 b: v
{
7 A2 n2 }3 @2 n$ Y2 A1 G: z9 g( b) g temp[k++]=data[i++];% S+ G7 n+ z& c: c/ R
}
/ n5 F4 H9 l y2 s* E else
2 V! i' n" w1 P7 ^7 t8 ^$ I* [ temp[k++]=data[j++];; Y% H9 _* K% t0 S& N6 K
}
/ o; \2 P) u7 h* w# Q5 B) H# {& f while(i<=mid)//以下两个while代表可能出现的特殊情况:i/j所在数组已经全部完成排序,但另一数组仍有>=1的元素未放入临时数组中
% p$ N: {3 J) O temp[k++]=data[i++];
7 r6 J, @% l: S! c while(j<=right)6 B% h9 T5 i4 N2 b+ I* K
temp[k++]=data[j++];& Q5 [/ h& g* W% B1 l2 z2 t' L
for(i=0;i<k;i++)//将临时数组中的元素全部放入原数组中,k=right-left,k代表了数组长度
3 P4 d# C. I; S' X data[left+i]=temp;
4 v! s. t# _" M! X1 }$ N4 a2 I} S W- j( L7 K- o6 g
void merge_array(float data[],int left,int mid,int right,float temp[])//哨兵简化: j: e( C3 i6 y, x' Z$ W4 V
{/ ~. l! ^3 U1 y
int max_num=INT_MAX;
8 H5 J: e# ]6 f; Q int len=right-left+1;9 E0 Y1 h( l- y: C
int data_left=new int [mid-left+2];
6 [ Z. d7 m5 n% ^; X. \0 \0 I int data_right=new int [right-mid+1];
6 ?# ?. w( p# l int i=0,j=0,k=0;
( T% s6 \) H! \( G/ G: W for(int k=left;k<=mid;k++) x& e) t% {( ^0 b9 U0 j
data_left[k-left]=data[k];
L: k& `) m% w7 W1 [! Y4 x data_left[k-left]=max_num;4 E7 ]7 G2 H5 m; k! W* t. g! |
for(int k=mid+i;k<=right;k++)
- `# Q+ ^# y- M4 P7 f data_right[k-mid-1]=data[k];
* q+ L3 K* E* A# M. T8 U data_right[k-mid-1]=max_num;
% R# m+ c& x- B$ U for(int k=0;k<len;k++)
8 i8 Y- c$ x" M) G3 W4 p {- s& C% `' P3 @( r. A4 r% W
if(data_left<=data_right[j])
: \: ^- e$ d6 k; |6 p j data[k+left]=data_left[i++];6 J: c8 {: i+ r' z: h
else3 K( K8 Q; h5 c- b5 c
data[k+left]=data_right[j++];" Z# G0 X! f4 ~2 c1 i- T* g% c( a
}
& i$ x, n2 Z/ ?2 [4 M6 Z}
3 {1 q& h; |2 _- f' v* O4 A$ ]7 P1 A5 Y# O. W5 ]+ ~
3 Q# t2 {- u0 h9 P
|
zan
|