- 在线时间
- 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语言
; O' h3 ~1 P& U4 V! O. [3 n直接插入排序法 原理:从无序数列向左遍历,从有序数组向左比较
- m: {7 C1 _2 o2 S& A//插入排序法- m! m# e5 C! l+ n# v3 b9 g
void straightsort(int*arr,int len)
4 l; e9 v4 s' a{
0 O2 L, a& Z7 e int temp,i,j;2 e7 v$ P( B+ j; q9 W
for(i=1;i<len;i++)//将首元素看成有序数组,i=1表示从第二个元素开始排序2 x; W, n: g8 q) `& w1 q
{
: | o9 a) M7 [8 ^- a temp=arr;//temp存放待插入元素. _) S7 u1 B# x. [/ b, o# J
for(j=i-1;j>=0&&arr[j]>temp;j--)//待插入元素向左比较,arr[j]代表已经排序的有序数组,满足j>=0,且arr[j]>temp1 y: [% t7 Z' w. T% p o. {1 }
{& q* `9 t# X* n! D
arr[j+1]=arr[j];//若条件成立,则将已排序数组向右移位,arr[j]最大可达arr处,即temp处
" T; k, N3 N# A( M! m9 L0 O( i( s }
* L5 [% e* }7 H: |. R: D3 t! J o: j arr[j+1]=temp;//当循环不成立或循环终止,此时arr[j]<=temp(或j=-1,所有有序数组都大于待排元素,)temp应位于arr[j+1]处,j随temp左移而发生变化(减小)& R% K! u2 x' p! t! }
}
1 ]* w1 I5 j7 R: A+ J5 G$ Q) u}% P9 e4 L: L$ N. o H Q3 T0 x$ h
# K! U: y9 @2 w2 K Y, d6 o
归并排序法 将一个数组从中间分为两部分,再分别对两部分进行排序(递归),最后将排好序的两部分对比合并
5 p7 z: J* W+ y9 I* j# V" W; l//归并排序法
$ _4 u, i) ]2 z. J) Tvoid merge_sort(float data[],int left,int right,float sorted_data[])( d- L0 x" A4 c2 l. b
{
! e V% J4 N$ H% n2 [! U P if(left<right)//排除原数组出现只有一个数据的情况(left=right)( e' O" i& _% {0 u! x
{: O5 \9 |# L: d# |: K
int mid=(left+right)/2;
" B0 O* U# k' J merge_sort(data,left,mid,sorted_data);
3 k4 N! O Q. T* S* U merge_sort(data,min+1,right,sorted_data);
! i( j6 B8 H( M/ H' z merge_array(data,left,mid,right,sorted_data);
% l9 Y; U' D1 j& G }
/ Z- v3 ]9 H: p9 L1 s) N}5 Z* g v! v# O# I: `! o4 Z3 |) @
void merge_array(float data[],int left,int mid,int right,float temp[])//data[]即待排子数组,直接用子数组排序,但将子数组分为两部分,temp[]即临时数组( D. |3 R. m V; V! g9 h' B
{
* t7 y ~0 t6 V. k4 G9 M; r" z$ M3 ? int i=left,j=mid+1;. Z0 l {+ D- m' d9 i- R8 d' }+ R
int k=0;
6 d1 \3 P4 m- s `5 n* L9 m7 l while(i<=mid&&j<=right)//循环条件,将较小数组放入临时数组temp[]中,同时i变为data[i+1]或j变为data[j+1]& b) U& V5 u, H, ~- d5 {
{$ W" l( k0 U- v
if(data<=data[j])
8 D9 Y O7 D* e) p0 ]2 s {
" g- P# H m( E# [- e temp[k++]=data[i++];
: f% i" |: t; |/ [2 g: o }
+ y2 @% _& ]' h, l4 _ else
( J+ k6 V8 r- U% c) ^# v temp[k++]=data[j++];
- M9 m0 j1 h5 \: J8 c& M6 D) {4 b }7 }* r. C( O# R- B. _5 H/ l) x9 Q* C
while(i<=mid)//以下两个while代表可能出现的特殊情况:i/j所在数组已经全部完成排序,但另一数组仍有>=1的元素未放入临时数组中" R* m; ]- { o6 W5 \3 `6 f/ l4 r' w
temp[k++]=data[i++];, V4 Y {, L$ b2 N6 c J9 \
while(j<=right)
0 i; s: p# T- p$ E3 O: X* G temp[k++]=data[j++];
0 T8 E0 I* D v% ]( k+ h6 Y6 n' ^ for(i=0;i<k;i++)//将临时数组中的元素全部放入原数组中,k=right-left,k代表了数组长度9 P9 K# b: G1 w% S' D0 a, j
data[left+i]=temp;
+ M' ]# o5 r& X}, L6 Q' K; L! O( Y' t6 \1 B6 ]
void merge_array(float data[],int left,int mid,int right,float temp[])//哨兵简化
. T" X7 A2 u% b! S{ S6 s' o' }4 \# H" F
int max_num=INT_MAX;
+ V% I! l4 V; G+ j% s1 z int len=right-left+1;0 `6 ^: t& R8 q& t+ J; v" i! A5 u
int data_left=new int [mid-left+2];
7 Y% {, }( l, V int data_right=new int [right-mid+1];
S" Z1 g. b/ T int i=0,j=0,k=0;' q- }+ T( T. W, U4 }+ \/ m
for(int k=left;k<=mid;k++)
$ G6 Y/ L P0 }# ] data_left[k-left]=data[k];
( z) @) d( {, ^; M" [- v data_left[k-left]=max_num;
$ }. M! E P* P9 \; l" `, }# P' I for(int k=mid+i;k<=right;k++). g$ A$ o* P" l$ b# q
data_right[k-mid-1]=data[k];
* M' L) q( Z8 j4 a' i1 n data_right[k-mid-1]=max_num;
7 L9 {" ]/ l9 e) p4 a& O: N+ j7 d for(int k=0;k<len;k++)
1 i x3 x" b1 T. |* P: y: E { x& j8 ]- s. m0 j/ d3 z+ r L% h
if(data_left<=data_right[j])" s f$ Q8 B' S, L
data[k+left]=data_left[i++];: \( W7 A! | d( H7 E* Q
else" t& S/ I) p+ N: F% v5 ^1 g( q
data[k+left]=data_right[j++];
7 O4 y2 o( C# P }
; S+ y% p: m& b! [5 j" a+ w}, a% L$ ^' T$ g& M: ^ e
' H t5 Q' K9 K+ Q. s5 @7 j% r4 q* P
|
zan
|