|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
《算法导论(第三版)》第二章2.3,使用哨兵的归并排序。4 C' Z, V1 s3 Q5 Y) F' f' E! W
主函数:' ]. R1 m: e0 V! ?% A
- A=[5 2 4 7 1 3 2 6];
- MERGE_SORT(A,1,length(A))
5 Q/ C! @0 i0 c' d4 b 0 d2 [3 `+ l! Z; ?- r- Z
% o$ {9 [8 p, K; j% C& L6 j
P) ~- \" O$ ^% G ?9 s1 r5 B
( U" p( i% X5 R2 V递归:
. [ ?( p B& C+ \+ {- %% 递归
- 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* c8 m5 ^) B* ?# F' P1 Y) K2 |
& v6 A1 E& D7 R' c/ n
% D8 n$ x3 i# @" B. b# H+ S# L8 L$ M& E1 Z* o9 r
4 A {/ M- L- t% P. Q0 g
排序:
G: y" S- e8 Y6 ]# J( k7 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
- end1 g7 l4 I4 [- g7 @4 N' ]
/ {$ C6 J: T+ ]+ R& G
|
|