|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
《算法导论(第三版)》第六章,堆排序% i/ @! B6 S% g9 b
4 Y5 D- {6 r/ b& q% O2 i7 hmatlab使用堆比较麻烦,且不好理解,就直接使用堆排序的思想,直接操作数组进行示意,简化代码。2 Q$ I8 V, Q3 S: _
% c. m- M2 B4 |# s3 ?! L' I
HEAPSORT
: ?: v. E) H/ U( Q9 Q6 ]4 ^" q+ 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%结果( Y0 I& y% C3 }# {1 _+ x
6 {; `7 ?: Q" t) u0 C3 @' {
2 a; X' ^7 N7 Z! w4 n& U2 m
z: R: y7 T! z: V7 `6 d建立堆
7 k* d G0 r; S8 U% Z+ u7 B- function [A] = BUILD_MAX_HEAP(A)
- for i=floor(length(A)/2):-1:1
- A=MAX_HEAPIFY(A,i);
- end
- end
5 C( ~! u9 f" | ~& Q
4 i# {( p9 z# H7 e, h9 O[color=rgb(51, 102, 153) !important]复制代码1 p+ P8 `3 V! s5 `/ V3 F2 U
堆处理
\$ H- b7 n* r6 F4 ~* 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
- end
, }* T) p1 \) X, }1 w* y' L* _9 X % F7 s& S0 {' u% D
) z/ |8 w7 {% [
3 u/ u! M+ V7 O: t% q5 a) Y |
|