|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
+ J3 B( m* b+ W3 W& ^
《算法导论(第三版)》第二章2.3,使用哨兵的归并排序。
* C) f& f' H j7 c; s8 Q& [ H, F主函数:; n4 G$ e* G. B: H
- A=[5 2 4 7 1 3 2 6];
- MERGE_SORT(A,1,length(A))
+ a0 `1 y+ d4 G; a0 `2 A
$ \7 i0 x) f+ b5 {
t. Z7 D& l5 B3 m; [8 [( P递归:: i. ^, \8 C) b; x; ?8 r1 p/ B
- %% 递归
- 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. E9 U: m9 m) @6 g5 ~9 M
7 a) \, n( Y. ~$ I% M1 c
; E8 D i; x" ]: z4 n9 s( G; a排序:% F- z% Z1 u% W% b, T
- %%排序
- 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
( c" b/ _, [5 |7 k* N: T
1 e# S8 q! r7 f. x2 K/ P- ] z0 ]1 q) g2 B! H/ x3 E
|
|