|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
; v" X/ D* D/ ?* O- F/ j1 V; V8 |
《算法导论(第三版)》第二章2.3,使用哨兵的归并排序。
: S& ]3 A3 K- \0 |) ?主函数:
( u, t( w6 i# M- A=[5 2 4 7 1 3 2 6];
- MERGE_SORT(A,1,length(A))- @$ O/ c, B2 D1 q3 Z3 `) ]0 c7 R
; X) b: Y7 P8 X* x* d9 n T1 Y) u
, N% Q8 y9 G; j5 x8 T2 `: j递归:0 Q, y; K/ Z- d& p$ a& V
- %% 递归
- 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# p$ ^; _* B! _: b1 m
0 O6 y8 F1 A1 g
6 {! s0 `6 \+ U8 n8 f5 }# ~/ W4 C) @排序:
Q, f; {$ h7 E, p2 W- %%排序
- 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' K0 i' s2 @% E( X4 `- c4 u& O. k
- b% @0 ~2 N. H# m: O
% f9 N6 C W Q" g, K, p2 \
|
|