|  | 
 
| 
x
EDA365欢迎您登录!您需要 登录 才可以下载或查看,没有帐号?注册  4 C# f9 U7 E: F5 G, U( W: K《算法导论(第三版)》第二章2.3,使用哨兵的归并排序。
 Z" H" y9 S2 T5 t0 K* ?主函数:' S5 r8 T4 N- ^
 
 / k+ f' N9 F5 x+ v: m. mA=[5 2 4 7 1 3 2 6];MERGE_SORT(A,1,length(A))8 T  _/ ^& U2 ]: m
 
 - N( M4 F7 N% z5 s: R/ R递归:' T+ b/ m6 w. L  f8 n4 S
 
 %% 递归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);%排序    endend! t% U- p  m6 S- m. K
 " y, F. g" C5 F4 x
 . D% k* t7 w, y! }% {) i排序:, v- P, z! a9 X% \" q# S
 
 %%排序function [A] = MERGE(A,p,q,r)%A是数组,p<=q<=rL=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;        endendend. y- G' y6 }2 Q* r6 v! o
 4 J" h( x9 M$ I6 D# d+ R# _* G6 S0 ^# l
 
 | 
 |