|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
《算法导论(第三版)》第六章,堆排序- m+ r/ w0 b/ E/ v; D
/ S8 @) F7 x& A# _. i5 E+ dmatlab使用堆比较麻烦,且不好理解,就直接使用堆排序的思想,直接操作数组进行示意,简化代码。3 g' _4 w/ ~" G# w) [: e
7 J+ M2 n' f) }. R
HEAPSORT2 J& _2 {8 _& g
- 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%结果
( z$ L0 j, `' i
9 m! m9 {2 `+ s- n8 k2 }5 E% I
: l; X, q, q3 ?; I7 d- _4 i
' m; `! t0 q2 p) j( Z建立堆& t+ p1 Z2 a( e& c
- function [A] = BUILD_MAX_HEAP(A)
- for i=floor(length(A)/2):-1:1
- A=MAX_HEAPIFY(A,i);
- end
- end
9 @$ S; G- w! d6 i6 l 0 P1 Z. O# t& i7 k8 E4 b F
[color=rgb(51, 102, 153) !important]复制代码
9 A1 y" l T' A3 O F4 F堆处理, A" `2 y% i4 D$ j
- 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$ v, K$ \; V( j; o
+ F8 k. A/ }& E" c6 g9 Y
" `/ p Y% z! u" t
+ E, H7 f; \ j" }" ]: J# H" s |
|