|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
5 s# w. p8 @2 h$ Z2 @9 w
《算法导论(第三版)》第二章2.3,使用哨兵的归并排序。6 `2 U) S0 f' O& v& q) B; x6 M
主函数:
( s G. j, q8 z, A4 e/ k6 x2 n0 {- A=[5 2 4 7 1 3 2 6];
- MERGE_SORT(A,1,length(A)) {" P1 y7 Q$ \
9 h: n' \, @/ r; p* W9 U* {2 _# R
$ U* F/ I {. }5 H# R7 e, g! T递归:& l' K) F/ j/ j# l4 M+ c L# Y
- %% 递归
- 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
- end7 X) h$ r6 Z7 [0 H! z$ {7 o
# ^# t. f7 t) L7 T, c# o
" _8 `6 v; N7 I9 x& \ {排序:
3 l0 j% @$ S' C2 n- %%排序
- 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
% m7 f8 ?- |! Y" x9 g5 j$ {
9 b5 p0 Z# N9 b# @/ W
% X; W# m1 i) n* F7 @. w2 S |
|