|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
% x$ P3 @; |6 h7 E. o ~
《算法导论(第三版)》第二章2.3,使用哨兵的归并排序。. a/ _+ ]6 e. t( z, p
主函数:) T. U, @0 j0 w6 K5 q" Q2 ^
- A=[5 2 4 7 1 3 2 6];
- MERGE_SORT(A,1,length(A))
% k9 g; N/ I% u' J/ r; C1 S0 m- y8 l / _% d) w# s2 R! o. W4 x( x
- E6 i: E/ g3 g/ h
递归:6 l4 |. Z$ r8 `, J) @; M( o9 j
- %% 递归
- 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
8 S; _: M& [4 \( m0 j
# c. l: W' v w5 {1 l9 ^. Q5 Z3 x' f' w: u: f
排序:
9 w( ^0 N2 u0 D2 P+ k* e7 b) Y% u( A3 r- %%排序
- 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% o0 q1 e* S) {# n6 y3 l9 e
]6 U& `, G% p' {- _0 {4 \
! Y0 ?2 w( P! i/ O5 F |
|