|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
《算法导论(第三版)》第六章,堆排序
& ?2 _* B! A1 H) [. |+ \( v! v) S+ c
matlab使用堆比较麻烦,且不好理解,就直接使用堆排序的思想,直接操作数组进行示意,简化代码。
" s9 ?# O7 { o3 X0 e1 J5 o. c
& x5 B! f. E% b4 q: P3 vHEAPSORT
/ o( z7 h: M4 @/ X/ [4 F; e% ]1 D- 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%结果+ ^! |5 d5 ]9 H, E
; j' G! \! E/ O& X' Y% R3 C* ]6 G% H+ g* J- I% W4 x
" J- d J, d0 d9 F2 Q
建立堆% r }& O+ B( u' l! Q) s! ^4 ?
- function [A] = BUILD_MAX_HEAP(A)
- for i=floor(length(A)/2):-1:1
- A=MAX_HEAPIFY(A,i);
- end
- end2 Z$ N* e3 @0 m' V
0 n* P4 B1 h; R- a# s; T2 o[color=rgb(51, 102, 153) !important]复制代码
" L: P t" {7 R$ z. _# h堆处理
5 {- H! ]/ V" t. h- 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
5 q6 t) T: `$ Q- s L ; C( h& e' y% m t3 W) X
6 R( `3 v: l7 B O7 q
" F. E0 D) F' n
|
|