|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
《算法导论(第三版)》第二章2.3,使用哨兵的归并排序。5 v* a0 y. H3 ?. T, _; h& A' A
主函数:. e" j: v7 h+ f" k! E
- A=[5 2 4 7 1 3 2 6];
- MERGE_SORT(A,1,length(A))
. u1 `" j; `+ n) ~( t
4 ]4 _; q# t% l' h2 L* f" M) M" X) {5 [% O
8 O7 I. B! T7 k4 R7 d( ~
9 t' a' c% ?) r7 k9 {6 J& V: ?递归:4 c' K& x; F5 _" E
- %% 递归
- 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
, w! U9 z" S! n2 c0 i7 c
' s, @) |7 B- H; x( A# J
. K4 N3 [" h* h g- p
J& [ `4 X: \6 A- _0 t2 I1 u* \+ v m% g4 Y
排序:' g/ l, l6 W0 m# _% 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( P- b" q3 r% m" @( Q5 P
) \ z M: c& {3 p5 q- V: J, g
|
|