| 
 | 
	
    
 
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册  
 
x
 
《算法导论(第三版)》第六章,堆排序 
. P' Y* {8 u+ G" d2 q/ E9 T7 j( ?7 i( }) ^$ t  }0 p2 I 
matlab使用堆比较麻烦,且不好理解,就直接使用堆排序的思想,直接操作数组进行示意,简化代码。' z/ s  |* m) }$ n9 [* C6 p 
: f) C3 ^$ l8 ]( ?  @2 w 
HEAPSORT 
4 [# N/ |  J: J  {- 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%结果9 y$ h+ W/ a; a& \& a/ [
 
 
  
- }* q& Z1 w3 q# T  H: p6 s8 r  D0 g5 b1 l, U+ X! j) Z- B+ D 
* C$ _0 E2 v" ?% O6 p3 z0 O5 L 
建立堆6 W; c4 V) S( o: T& f0 u 
- function [A] = BUILD_MAX_HEAP(A)
 - for i=floor(length(A)/2):-1:1
 -     A=MAX_HEAPIFY(A,i);
 - end
 - end
 
2 p+ y7 b" J5 @ 
  
0 P! }$ n) J6 r' C0 ~( L[color=rgb(51, 102, 153) !important]复制代码8 p  ?: c- w4 s. x$ Y, a$ D0 ?" J 
堆处理1 b* S' @, z) c7 @ 
- 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
 
4 M. H4 g1 V( X7 r2 Z 
  
* Q6 V5 o& F7 v+ A% q$ f' f: a* `* b& Y# b6 T# p 
' o  f9 o( r8 z0 |) E 
 |   
 
 
 
 |