|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
《算法导论(第三版)》第六章,堆排序的应用之最大优先队列
: C" |9 U2 E! ?( f; v1 b. d/ I6 B" i
主函数:
0 v G2 t: Z9 ]" w" h- %测试任意功能前,需将其它功能注释了
- clear;clc
- A=[16 14 10 8 7 9 3 2 4 1]%测试队列
- %[A MAX]=HEAP_EXTRACT_MAX(A) %提取最大值
- %HEAP_INCREASE_KEY(A,9,3);%3<4,当前测试会报错
- %HEAP_INCREASE_KEY(A,9,15)%15>4,8取代4,并且15会到第二位置
- A=MAX_HEAP_INSERT(A,17)%队列长度+1,17将会在第一位,
* J( U9 ^$ j+ f/ Z3 [7 o* k4 o' M2 } 8 V, n$ v/ c- n9 c- ?* @/ L
4 x& A2 t- ?/ {6 WHEAP_INCREASE_KEY
' J/ k% x9 ]+ Q" T1 O- function [A] = HEAP_INCREASE_KEY(A,i,key)
- if key<A(i)%新更新的值比原值小,则直接报错
- error('new key is smaller than current key');
- end
- A(i)=key;%更新值
- while i>1 & A(floor(i/2))<A(i)%父值比子值小,则一直更新
- temp=A(i);
- A(i)=A(floor(i/2));
- A(floor(i/2))=temp;
- i=floor(i/2);
- end
- end1 g0 g4 o% w) M
; \' b1 r6 c. m
- Z7 G* s! @! c$ R) X. sHEAP_EXTRACT_MAX; |0 {3 i3 H) J; Y/ p" r
- function [A,MAX] = HEAP_EXTRACT_MAX(A)
- if length(A)<1%A为空,则报错
- error('heap undeRFlow!')
- end
- MAX=A(1);%A(1)就是优先队列的最大值
- A(1)=A(end);%末尾的提到最前
- A(end)=[];%去掉末尾
- A=MAX_HEAPIFY(A,1);%重新进行一次排列
- end
; @' j* `5 z4 L) C; Q
3 h7 W1 I1 f v3 |; }/ R# y8 n9 [
% t& ?8 u0 F w6 ?1 ]% WMAX_HEAP_INSERT
' H; Z/ F: l% e2 x6 J4 n( B' e- function [A] = MAX_HEAP_INSERT(A,key)%加入新值
- A(end+1)=-inf;%长度+1
- A=HEAP_INCREASE_KEY(A,length(A),key);
- end& x8 T/ ~, z3 o: e4 K
2 S! ~4 Z0 E% y* w/ g T# T5 Q
) L5 ]7 h' }! O% i7 b. _3 ]
MAX_HEAPIFY. j9 y! Y- w, w$ H5 t8 i- F5 a
- 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% o+ [2 b. D! |9 z- M- o% q
, F3 a1 D) c) w X0 \( I5 o7 M: o# P, h& c4 z0 ]0 O0 R
4 S; x( y( q2 x) n0 m: U7 o5 |4 I
|
|