找回密码
 注册
关于网站域名变更的通知
查看: 377|回复: 3
打印 上一主题 下一主题

《算法导论(第三版)》第六章,堆排序的应用之最大优先队列

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-3-10 10:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
《算法导论(第三版)》第六章,堆排序的应用之最大优先队列& n: L, x# f6 n  r+ F( [0 U; k+ q

& }1 O' J7 u7 L: T* g0 P) Y+ F" Z主函数:" F1 y4 Q# \. [7 J" Y9 c& c
  • %测试任意功能前,需将其它功能注释了
  • clear;clc
  • A=[16 14 10 8 7 9 3 2 4 1]%测试队列
  • %[A MAX]=HEAP_EXTRACT_MAX(A)  %提取最大值
  • %HEAP_INCREASE_KEY(A,9,3);%3<4,当前测试会报错
  • %HEAP_INCREASE_KEY(A,9,15)%15>4,8取代4,并且15会到第二位置
  • A=MAX_HEAP_INSERT(A,17)%队列长度+1,17将会在第一位,) N# Y! }, X9 g- N+ y2 j; }

- G7 a$ J: K" Q% C7 j3 u* W. r4 z' r

; w  d) E3 d4 y! t( V4 I! lHEAP_INCREASE_KEY
- c8 [, r2 z& g6 k: D8 j
  • function [A] = HEAP_INCREASE_KEY(A,i,key)
  • if key<A(i)%新更新的值比原值小,则直接报错
  •     error('new key is smaller than current key');
  • end
  • A(i)=key;%更新值
  • while i>1 & A(floor(i/2))<A(i)%父值比子值小,则一直更新
  •     temp=A(i);
  •     A(i)=A(floor(i/2));
  •     A(floor(i/2))=temp;
  •     i=floor(i/2);
  • end
  • end
    8 \2 s" J) \  f  w5 W8 y7 U1 `- R5 H: Y/ F
  l0 O0 H8 e: _

9 f2 |7 `2 v$ I# K) H- ~& H. ~- l, @HEAP_EXTRACT_MAX% N3 R* j% k; G: E* h% J
  • function [A,MAX] = HEAP_EXTRACT_MAX(A)
  • if length(A)<1%A为空,则报错
  •     error('heap undeRFlow!')
  • end
  • MAX=A(1);%A(1)就是优先队列的最大值
  • A(1)=A(end);%末尾的提到最前
  • A(end)=[];%去掉末尾
  • A=MAX_HEAPIFY(A,1);%重新进行一次排列
  • end$ I; M$ S% a' @9 T/ @; A, u' ~
% o* D5 j# f" N) d

/ \% H& y% E+ QMAX_HEAP_INSERT
0 }0 H/ x( t2 A1 R# ]$ r
  • function [A] = MAX_HEAP_INSERT(A,key)%加入新值
  • A(end+1)=-inf;%长度+1
  • A=HEAP_INCREASE_KEY(A,length(A),key);
  • end) N! \7 J2 V; e# b6 ]8 h

" E& L$ r1 [7 d- k. B0 p
; O% t) ?$ k" D9 ?
MAX_HEAPIFY1 x5 ^4 \  W+ `% R* b" \- b9 i
  • 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
    1 S- B) t6 n) v6 N0 \
! Z1 p' q- D$ O

& |5 O; K3 U/ Q/ O  a! Y6 J9 A
1 X- v5 u# ]; X- E. _% c' D

该用户从未签到

2#
发表于 2020-3-10 17:48 | 只看该作者
堆排序的应用之最大优先队列。

该用户从未签到

3#
发表于 2020-3-11 16:59 | 只看该作者
堆排序的应用之最大优先队列) 。

该用户从未签到

4#
发表于 2020-3-12 18:15 | 只看该作者

  I& s1 ]. n& N堆排序的应用之最大优先队列。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 00:50 , Processed in 0.156250 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表