|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
《算法导论(第三版)》第二章2.3,使用哨兵的归并排序。
8 ~* @2 K. v5 l: q6 }' H9 O主函数:
H* i/ F( Z( l2 s( w/ K- A=[5 2 4 7 1 3 2 6];
- MERGE_SORT(A,1,length(A)); `$ S$ @# Q; }
5 x1 ?' E `0 G3 ?" K8 \8 k7 q
0 Y/ |6 |% E( K. P: {% m
+ b1 n9 _1 [' j' I+ ^) S
m @1 J9 p+ U( {3 N5 N
递归:
/ a) T3 {! D5 \9 S: L- %% 递归
- 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; I9 d' B" G* L8 f' ^- @6 z* ?- s
) g& Y$ S V0 s- f- I
; d( \* {& A: J# n9 g3 A( n0 q6 ~- n
- O3 r- y5 U$ S
排序:
$ }0 g/ G. I9 e8 |# o+ Q5 d- %%排序
- 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
- end0 r' b- S* p% J0 `$ `6 ?
/ _5 U2 D' _5 N |
|