|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
, G$ g, j. B6 b1 W2 Q* N' h1 i《算法导论(第三版)》第二章2.3,使用哨兵的归并排序。
+ Z* c M4 f) U$ J主函数:
6 Q+ [1 K ?( u( x1 y' |- A=[5 2 4 7 1 3 2 6];
- MERGE_SORT(A,1,length(A))" q0 o* T2 v/ R C
+ X( y. `- D0 \! E ~+ N: ]3 G3 g" E/ P# W1 F& N$ p( g U
递归:8 g0 G' R2 ~3 X7 ~' J
- %% 递归
- 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' l& m/ l3 o2 E9 G& X
; N! D2 J; T- Z( S
+ \" w) V. E) k) K8 D
排序:
) d4 J3 o5 x7 g0 K: z1 e- {, q4 k- %%排序
- 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
" l" ]: ~3 T7 a: P, K# Z% c 2 n& R5 P3 Z# f+ S+ c, N3 a
) X i" |8 a+ D5 z4 l# H
|
|