|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
《算法导论(第三版)》第六章,堆排序) P* q/ w2 O2 v, `: N9 o, Q1 W: W
* p( R' B0 [% I% W0 Kmatlab使用堆比较麻烦,且不好理解,就直接使用堆排序的思想,直接操作数组进行示意,简化代码。
: ?! Z8 a; ^* r) Y, B' \" e: r! M5 n
HEAPSORT
8 X0 j0 Q( c( b# G7 t- w% Q- 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%结果6 X' U% x- v: I# ~) b4 C9 f) [
9 b: f, \$ d' Z( [7 ?* A( {$ r$ R. t ^, B" A0 R, u3 Q' a
% c: y$ i& ^8 f2 N* n
建立堆; N: `+ y' b: S0 r5 Q2 l
- function [A] = BUILD_MAX_HEAP(A)
- for i=floor(length(A)/2):-1:1
- A=MAX_HEAPIFY(A,i);
- end
- end/ r$ Y; e- O6 ?
0 C2 T4 o9 y' G7 R. N& T: Y
[color=rgb(51, 102, 153) !important]复制代码' z$ p8 D( L4 T( O3 H
堆处理. U( @$ ~# {5 q! h& N
- 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$ o5 |& m6 Z9 M* i1 ]# O8 ^
; \ X9 f `3 t% `& _# ?3 }% s# U- @* u2 m
" z% m3 o, s L+ e# V: M+ R
|
|