|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
《算法导论(第三版)》第六章,堆排序
+ b3 v* q9 F, Z
* o$ _- t3 W" W" d* x B# Cmatlab使用堆比较麻烦,且不好理解,就直接使用堆排序的思想,直接操作数组进行示意,简化代码。
5 n% _% G. I; L# D, \! _- j% x4 K4 B- D$ e; d; G
HEAPSORT# e/ }) d9 w/ B+ W; q4 g2 Q, 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%结果3 I- h* k3 t5 e# ]9 \2 A3 [
" s7 \; |) m m/ @* b" e9 z" g( \0 K, L/ A! S3 g
- T1 k. L& D9 c% }/ i
建立堆
1 Y# ~. v! F8 I" U- function [A] = BUILD_MAX_HEAP(A)
- for i=floor(length(A)/2):-1:1
- A=MAX_HEAPIFY(A,i);
- end
- end
( [* o/ k, ?, F2 m; z& W 0 p0 {5 s5 ?5 i9 P& h
[color=rgb(51, 102, 153) !important]复制代码
9 L4 L, B) J3 S! E: O5 c* M1 @7 }8 C堆处理3 l1 W7 H# b9 U8 u
- 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/ r @, g" j! [! t, ^
( q) p8 u" M: A" {- t% A5 Z# c
7 G6 {7 Q6 U d
8 A8 G2 X I4 F8 ?
|
|