|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
《算法导论(第三版)》第六章,堆排序% a) W0 \* q" B* m
7 k% r6 O1 h& ]( v) Y8 W% N [matlab使用堆比较麻烦,且不好理解,就直接使用堆排序的思想,直接操作数组进行示意,简化代码。
7 y e7 U+ Z/ d2 y2 {- C
! ~& E; X/ Z( d9 L5 oHEAPSORT, \8 j6 A5 w2 c% ?5 ^3 E
- clear;clc
- A=[16 14 10 8 7 9 3 2 4 1]%数组
- %A=[4 1 3 2 16 9 10 14 8 7]%数组
- A=BUILD_MAX_HEAP(A);%建最大堆
- for i=length(A):-1:1%反方向引导退出
- temp(i)=A(1);
- A(1)=A(i);
- A(i)=[];
- A=MAX_HEAPIFY(A,1);
- end
- A=temp%结果
3 e1 D$ n* n3 A: u. s; r 9 E ]+ a" x6 u& i6 Z+ l: o
$ G6 U" D8 y( O
t7 Z9 v2 E" A5 p6 a$ m# F建立堆
% P' c: M1 w' L" I- function [A] = BUILD_MAX_HEAP(A)
- for i=floor(length(A)/2):-1:1
- A=MAX_HEAPIFY(A,i);
- end
- end
+ n- h" c I R/ P ^ - Y5 x: J1 u3 k/ R
[color=rgb(51, 102, 153) !important]复制代码
, u- g3 V, {% ~0 Z' v* N堆处理
7 k k) f" g% x- function [A] = MAX_HEAPIFY(A,i)
- l=2*i;%左节点序号
- r=2*i+1;%右节点序号
- %比较该节点与左右子节点的大小
- if l<=length(A) & A(l)>A(i)
- largest=l;
- else
- largest=i;
- end
- if r<=length(A) & A(r)>A(largest)
- largest=r;
- end
- %如果最大子节点变换,则交换,继续递归。
- if largest~=i
- temp=A(i);
- A(i)=A(largest);
- A(largest)=temp;
- A=MAX_HEAPIFY(A,largest);
- end
- end
; D3 D. z* f' a. Z/ M " N+ l s6 G" J0 j+ e$ C
4 c, e/ n7 y& S
" ~0 s6 Q1 Z+ ?2 u |
|