专题三数据结构与算法.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
3 堆排序思想 ① 对一组待排序的记录,按堆的定义建立堆; ② 将堆顶记录和最后一个记录交换位置,则前n-1个记录是无序的,而最后一个记录是有序的; ③ 堆顶记录被交换后,前n-1个记录不再是堆,需将前n-1个待排序记录重新组织成为一个堆,然后将堆顶记录和倒数第二个记录交换位置,即将整个序列中次小关键字值的记录调整(排除)出无序区; ④ 重复上述步骤,直到全部记录排好序为止。 结论:排序过程中,若采用小根堆,排序后得到的是非递减序列;若采用大根堆,排序后得到的是非递增序列。 堆排序的关键 ① 如何由一个无序序列建成一个堆? ② 如何在输出堆顶元素之后,调整剩余元素,使之成为一个新的堆? 4 堆的调整——筛选 ⑴ 堆的调整思想 输出堆顶元素之后,以堆中最后一个元素替代之;然后将根结点值与左、右子树的根结点值进行比较,并与其中小者进行交换;重复上述操作,直到是叶子结点或其关键字值小于等于左、右子树的关键字的值,将得到新的堆。称这个从堆顶至叶子的调整过程为“筛选”,如图10-10所示。 注意:筛选过程中,根结点的左、右子树都是堆,因此,筛选是从根结点到某个叶子结点的一次调整过程。 图10-10 堆的筛选过程 49 25 37 28 19 65 34 18 27 15 49 25 37 28 19 65 34 27 18 15 49 27 37 28 19 65 34 25 18 15 49 25 37 28 19 65 34 18 15 27 ⑵ 堆调整算法实现 void Heap_adjust(Sqlist *H, int s, int m) /* H-R[s…m]中记录关键字除H-R[s].key均满足堆定义 */ /* 调整H-R[s]的位置使之成为小根堆 */ { int j=s, k=2*j ; /* 计算H-R[j]的左孩子的位置 */ H-R[0]=H-R[j] ; /* 临时保存H-R[j] */ for (k=2*j; k=m; k=2*k) { if ((km)(LT(H-R[k+1].key, H-R[k].key)) k++ ; /* 选择左、右孩子中关键字的最小者 */ if ( LT(H-R[k].key, H-R[0].key) ) { H-R[j]=H-R[k] ; j=k ; k=2*j } else break ; } H-R[j]=H-R[0] ; } 5 堆的建立 利用筛选算法,可以将任意无序的记录序列建成一个堆,设R[1],R[2], …,R[n]是待排序的记录序列。 将二叉树的每棵子树都筛选成为堆。只有根结点的树是堆。第?n/2?个结点之后的所有结点都没有子树,即以第?n/2?个结点之后的结点为根的子树都是堆。因此,以这些结点为左、右孩子的结点,其左、右子树都是堆,则进行一次筛选就可以成为堆。同理,只要将这些结点的直接父结点进行一次筛选就可以成为堆…。 只需从第?n/2?个记录到第1个记录依次进行筛选就可以建立堆。 可用下列语句实现: for (j=n/2; j=1; j--) Heap_adjust(R, j , n) ; 6 堆排序算法实现 堆的根结点是关键字最小的记录,输出根结点后,是以序列的最后一个记录作为根结点,而原来堆的左、右子树都是堆,则进行一次筛选就可以成为堆。 void Heap_Sort(Sqlist *H) { int j ; for (j=H-length/2; j0; j--) Heap_adjust(H, j , H-length) ; /* 初始建堆 */ for (j=H-length/2; j=1; j--) { H-R[0]=H-R[1] ; H-R[1]=H-R[j] ; H-R[j]=H-R[0] ; /* 堆顶与最后一个交换 */ Heap_adjust(H, 1, j-1) ; } } 7 算法分析 主要过程:初始建堆和重新调整成堆。设记录数为n,所对应的完全二叉树深度为h 。 ◆ 初始建堆:每个非叶子结点都要从上到下做“筛选” 。第i层结点数≤2i-1,结点下移的最大深度是h-i,而每下移一层要比较2次,则比较次数C1(n)为: C1(n) ≤ 2 ∑ (2i-1×(h-i))≤4(2h-h-1) h-1 i=1 ∵ h=?㏒2n?+1, ∴ C1(n)≤4(n-㏒2n-1) ◆ 筛选调整:每次筛选要将根结点“下沉”到一个合适位置。第i次筛选时:堆中元素个数为n-i+1;堆的深度是?㏒2(n-i+1)?+1,则

文档评论(0)

Lxq3610 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档