- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40293 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12799
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
无C不行,废物一个,算法导论:C语言9 T2 B6 x: I# z; V
直接插入排序法 原理:从无序数列向左遍历,从有序数组向左比较
A& E6 A- l+ \- }8 U//插入排序法
- e" @0 g) h+ Y) G1 Bvoid straightsort(int*arr,int len)
; I) q$ x' Z7 R2 o. s# Y" x{
* K" V1 k) T% g: J% ^& B int temp,i,j;' y/ P0 w- P6 ^* Z! r) `" W
for(i=1;i<len;i++)//将首元素看成有序数组,i=1表示从第二个元素开始排序
/ O) {2 R( a" I' `6 ^ {! H% m! H; m7 l$ r( J
temp=arr;//temp存放待插入元素
4 h$ M3 h' V1 e) P1 P! Q% e3 l# H for(j=i-1;j>=0&&arr[j]>temp;j--)//待插入元素向左比较,arr[j]代表已经排序的有序数组,满足j>=0,且arr[j]>temp
7 A6 W G) y5 `5 t! _+ L {3 U& v0 `0 P# ^
arr[j+1]=arr[j];//若条件成立,则将已排序数组向右移位,arr[j]最大可达arr处,即temp处
2 M4 \( i" L+ z) p2 r8 ? }
4 [1 O0 L5 k( P# j, ?6 b+ U arr[j+1]=temp;//当循环不成立或循环终止,此时arr[j]<=temp(或j=-1,所有有序数组都大于待排元素,)temp应位于arr[j+1]处,j随temp左移而发生变化(减小)! K! l' t* S6 E8 t$ ^6 V
}# ]) [2 I" \/ k7 Q/ F- E3 Q1 U9 h
}, E, l, T/ @3 @# _# G8 c- e$ g
8 t+ J1 K( z- d% M
归并排序法 将一个数组从中间分为两部分,再分别对两部分进行排序(递归),最后将排好序的两部分对比合并
$ _/ ]& v$ ?' L4 W5 [//归并排序法! h' A' D/ K: t) T5 w% z
void merge_sort(float data[],int left,int right,float sorted_data[])
) w& k h+ |* q9 O8 Q{
7 y7 O* f& G+ B- |; g f if(left<right)//排除原数组出现只有一个数据的情况(left=right)
; B, f# w5 R8 K5 D {
- H) k+ ]3 N3 k9 o& h# q int mid=(left+right)/2;6 }3 b, G4 v J8 _8 I! R
merge_sort(data,left,mid,sorted_data);4 i' @; T1 e: d7 F: |* T. U
merge_sort(data,min+1,right,sorted_data);: G6 {9 ?2 T0 I
merge_array(data,left,mid,right,sorted_data);: v; i- f" |/ P" o
}
8 d3 x! {7 e6 g% x2 P}* u, a F* N* Q f6 P) w4 m" w# H
void merge_array(float data[],int left,int mid,int right,float temp[])//data[]即待排子数组,直接用子数组排序,但将子数组分为两部分,temp[]即临时数组
, h! n6 f0 ~$ f3 i" X{
+ A4 N1 P3 L J int i=left,j=mid+1;
* M0 \; S. X& D/ _, R# x: s9 ?( ~ int k=0;+ e% X# O y, Z, A% H0 e
while(i<=mid&&j<=right)//循环条件,将较小数组放入临时数组temp[]中,同时i变为data[i+1]或j变为data[j+1], q E, H* R7 @1 n, e
{" T2 j& x1 i d
if(data<=data[j])
' v* m: Z6 |0 @/ ^$ u {6 w4 ]1 ~; e: r- J
temp[k++]=data[i++];, q& E+ }5 y8 @9 D: P2 {% Y: L$ k
}4 D+ p6 f( H) [) k0 N8 N( c
else
- S+ Z$ Y* m3 p1 N L: @: \ temp[k++]=data[j++];1 l3 v5 a9 D) j- z9 V
}; _8 q4 n) b0 g6 I7 S
while(i<=mid)//以下两个while代表可能出现的特殊情况:i/j所在数组已经全部完成排序,但另一数组仍有>=1的元素未放入临时数组中
* e- w+ @1 m: E6 @; ]: i9 n temp[k++]=data[i++];9 a. ]% K; A: l
while(j<=right)
3 b4 K9 v7 e( @- x9 \! Z( e0 D5 ^$ m2 \ temp[k++]=data[j++];
- Z) ^5 ~3 P# N& C9 Y7 g _ for(i=0;i<k;i++)//将临时数组中的元素全部放入原数组中,k=right-left,k代表了数组长度
. N ~" R( h: E! K" {1 _ data[left+i]=temp;
5 M- g$ h" F# b}& R" m$ Z N- k6 @7 ^
void merge_array(float data[],int left,int mid,int right,float temp[])//哨兵简化
4 }0 c) R7 {3 L; \1 h) v{
; u2 ]1 l% b) h) |9 D; e int max_num=INT_MAX;1 r1 e* V+ Q3 N. k( R0 q D+ ]$ ]
int len=right-left+1;
! J4 [- j% u1 I int data_left=new int [mid-left+2];
) v) T" h& s+ W int data_right=new int [right-mid+1];% M' k0 b9 ^. C+ Q
int i=0,j=0,k=0;1 e. h5 c# C" J+ J
for(int k=left;k<=mid;k++)% y$ E) m7 N1 @
data_left[k-left]=data[k];# ~+ l! o8 x) K, \: Y# L
data_left[k-left]=max_num;! i. R+ \9 _' B+ w( Q$ A
for(int k=mid+i;k<=right;k++)
5 v ~( Q( _0 p" d data_right[k-mid-1]=data[k];' L8 B" S: q% Z' w! H
data_right[k-mid-1]=max_num;$ h4 L+ K; b4 C8 R
for(int k=0;k<len;k++)1 K0 D" z) b6 C% L! o& J8 f7 N5 Y/ }5 v
{
( n& [ D# ?& A/ E if(data_left<=data_right[j])
- A2 }: `9 @* [- x* C data[k+left]=data_left[i++];
" h6 a6 d/ m2 m* P& k else5 d! g1 f0 p6 w; R; x
data[k+left]=data_right[j++];
0 h0 b' h( v$ B) v, w8 V$ i }
5 O0 w; N A4 c! m}* w6 f% W! e( R) N9 ^- {
0 ^! r6 o$ T3 e% U, G1 c+ e [- T1 u9 g0 N
|
zan
|