|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
《算法导论(第三版)》第六章,堆排序
, f6 m$ U- z" q9 u9 \% W( [! P- J4 T6 d1 j% S
matlab使用堆比较麻烦,且不好理解,就直接使用堆排序的思想,直接操作数组进行示意,简化代码。: J) ^; V9 h% c( Q6 T1 r u9 @/ k1 q
" Z0 |, X! J% W9 C" K8 r7 k% M
HEAPSORT
+ j! e4 A: s- b: p- 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%结果4 v7 u, G, r, ~8 Q! c) r6 V- N; h, J+ B
! A2 v" u p2 ~8 } Z/ L* m
0 `+ f' q$ E! n" u9 d- p. G$ P+ m' Y4 W, V9 }! s
建立堆
$ d7 u5 C0 k* Y" u& L/ i- function [A] = BUILD_MAX_HEAP(A)
- for i=floor(length(A)/2):-1:1
- A=MAX_HEAPIFY(A,i);
- end
- end) a& U/ t1 _7 g
+ \1 E7 T2 [" [$ C; d[color=rgb(51, 102, 153) !important]复制代码# x4 ]8 i/ d7 j M
堆处理 c& b L$ v$ j4 P* g
- 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
- end1 {6 U$ V1 o2 y; p @9 B- p) S
* O- |4 w6 h d o X4 y" @1 x6 O) @) P; {
' f- C" H9 {; Q9 }. t |
|