|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
《算法导论(第三版)》第二章2.3,使用哨兵的归并排序。
! P; l, F8 N' _; \4 M& {3 [主函数:7 V- P, U1 G& r. n
- A=[5 2 4 7 1 3 2 6];
- MERGE_SORT(A,1,length(A))
5 O N7 t2 C; ?4 l
' c0 X* ]4 Y; C7 A1 h/ y4 P
! s" W( o5 R. M% w; F3 M" W8 N
0 s# t6 J( p/ i: b( C( O1 l
) u: K- S% d! u' |& p7 c- k" Y递归:& s/ ?& y) p6 a3 m) T
- %% 递归
- 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
) k7 i* i8 S9 Q1 p6 S$ q# q
! e# w$ K) \# F) r
! s: s# H- b& _ f* l, d' o# C8 T5 o7 Q
; V3 M' P+ ], Q: m7 d* a排序:3 W2 I( O7 l# T x- e
- %%排序
- 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- k" d# C4 X; Z8 \
9 o7 ~1 r1 L* j* n" d
|
|