|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
《算法导论(第三版)》第六章,堆排序" W" ]" E) V8 O& V
7 M) v% l4 \4 \; J+ A
matlab使用堆比较麻烦,且不好理解,就直接使用堆排序的思想,直接操作数组进行示意,简化代码。
, V, \& M7 T/ v( t/ t3 c% j( [' C8 B+ ^" p, z# ?8 i8 F
HEAPSORT
3 h3 X5 v: ]: p1 C- X6 H0 w- 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%结果
) y' i% X$ k6 K& a, H
9 A4 C+ \* n6 |. w. [: K
# G$ U/ Z( v9 X) p8 Q1 p6 U7 B
" W7 c& w) e z* F建立堆& r; P# _# X& c% _6 L& L7 T
- function [A] = BUILD_MAX_HEAP(A)
- for i=floor(length(A)/2):-1:1
- A=MAX_HEAPIFY(A,i);
- end
- end
3 T- }# f/ Q, [5 c! V$ I/ e
6 o4 i% T- S" Z( Q: f! M) f[color=rgb(51, 102, 153) !important]复制代码
8 }) L% ]( H4 {9 [4 ], o8 a堆处理
. e) v, P2 z3 z$ A; B# W- 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' x( j3 K. O- E% T/ v: x8 k0 ]; l
0 ?/ Q/ f ]. [. B
5 J6 k& P9 z5 i, U! V$ F0 J$ J7 J |2 I
|
|