|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
《算法导论(第三版)》第二章2.3,使用哨兵的归并排序。
/ x: z, T% a) E; Q- Y主函数:3 ], d% ?2 _" @# e3 I9 m" N
- A=[5 2 4 7 1 3 2 6];
- MERGE_SORT(A,1,length(A))$ K/ N0 F( O! P) q
* ^( v O5 x% S# K* m
! ?1 A3 V- X7 w: d6 Y
( k& L' Z6 I' f# ^% h
/ P( Y$ U+ _( q7 Z1 v递归:
1 ]6 g) i4 x3 J7 G* G- %% 递归
- function [A] = MERGE_SORT(A,p,r)%A是数组,p在前,q在后
- if p<r %判断是否到底,相等即只有一位数,不再分解
- q=floor((p+r)/2);%中间值,首尾相加除以2,再向下取整;
- A=MERGE_SORT(A,p,q);%前半段
- A=MERGE_SORT(A,q+1,r);%后半段
- A=MERGE(A,p,q,r);%排序
- end
- end
) c5 u6 O9 B0 O4 ]1 K ; [5 i K$ n% o( V8 I6 l# X* g
& W1 I6 L6 [& H# f
+ p; t8 ^! h" R1 s$ \9 O7 K$ m2 J0 x! h- R
排序:) s1 v6 s) g; b Y1 v( D9 s
- %%排序
- function [A] = MERGE(A,p,q,r)%A是数组,p<=q<=r
- L=A(p:q);%前半段
- R=A(q+1:r);%后半段
- L(end+1)=inf;%前半段哨兵 哨兵的用处:避免某个半段值已用完,无法做比较。
- R(end+1)=inf;%后半段哨兵
- i=1;%序号
- j=1;%序号
- for k=p:r %进行排序
- if L(i)<=R(j) %判断前后两个半段是谁先放
- A(k)=L(i);
- i=i+1;
- else
- A(k)=R(j);
- j=j+1;
- end
- end
- end/ S# I( E; H- M( v* }
: G5 a5 ?2 L2 O1 |2 w( j E |
|