网站大量收购独家精品文档,联系QQ:2885784924

第四讲 查找与排序.ppt

  1. 1、本文档共45页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第四讲 查找与排序

例如,假设文件中8个记录的关键字,我们不采用顺序比较,而是先从第一个关键字开始每隔4个关键字进行比较;同理第二个也从隔4个关键字进行比较,第三个…,第四个…,依次做下去.题中选d1=4,从小到大排序: 例 初始 d1=4 46 55 13 42 94 17 05 70 55与17 13与05 第一趟后结果 46 17 05 42 94 55 13 70 46与05 94与13 46与13 第二趟后结果 d2=2 05 17 13 42 46 55 94 70 13,46分 别交换两 次 05 13 17 42 46 55 70 94 第三趟后结果 d3=1 13与17 94与70 简单选择排序 基本思想:首先在n个记录中选择一个具有最小或最大关键字的记录,将选出的记录与记录集合中的第一个记录交换位置。然后在r[2]至r[n]中选择一个最小或最大的值与r[2]交换位置,…,依此类推,直至r[n-1]和r[n]比较完毕。 void slsort(List r,int n) //每次从r[j](j=i+1,…n)中选了最小值,与r[i](i=1,2,…,n-1)交换,进行分类 { for (i=1;i=n-1;i++) //共进行n-1趟排序 { m=i; for (j=i+1;j=n;j++) if (r[j].keyr[m].key) m=j; //m指示关键字最小的记录的序号 if (m!=i) { x=r[i]; r[i]=r[m]; r[m]=x; } } } 例:关键字序列{055,55,60,13,05,94,17,70},利用选择排序算法进行排序。 r[8] 70 r[7] 17 r[6] 94 r[5] 05 r[4] 13 r[3] 60 r[2] 55 r[1] 055 关键字 70 17 94 055 13 60 55 05 i=1,m=5 70 17 94 055 55 60 13 05 i=2,m=4 70 60 94 055 55 17 13 05 i=3,m=7 70 60 94 055 55 17 13 05 i=4,m=4 70 60 94 055 55 17 13 05 i=5,m=5 70 94 60 055 55 17 13 05 i=6,m=7 94 70 60 055 55 17 13 05 i=7,m=8 算法的复杂性分析: 当选择第一个最小值时需进行n-1次比较,选第二个最小值时需进行n-2次比较,…,选n-1个最小值时需进行n-(n-1)次比较, 所以总的比较次数为(n-1)+(n-2)+…+2+1=n(n-1)/2 故排序n个记录需要时间为O(n2)。 由于执行一次交换,需三次移动记录,最多交换n-1次,故最多移动次数为3(n-1) 堆排序 堆是由n个记录的线性序列{R1, R2, …,Rn}; 其关键字序列{k1,k2, …,kn},满足下列特性时,称之为堆。 或 若将此数列看成是一棵完全二叉树的顺序存储表示,则堆或是空树或是满足下列特性的完全二叉树:其左、右子树分别是堆,并且当左、右子树不空时,根结点的值小于(或大于)左、右子树根结点的值。 下列两个序列为堆,对应的完全二叉树如下图 {96,83,27,38,11,09} 96 83 27 38 11 09 12 36 24 85 47 30 53 91 ki≤k2i ki≤k2i+1 ki≥k2i ki≥k2i+1 大根堆 小根堆 {12,36,24,85,47,30,53,91} 1) 首先将一个关键字集合用完全二叉树的形式排列; 如给定关键字集合为{46,55,13,42,94,17,5,70}组成的完全二叉树如下: 46 55 13 42 94 17 5 70 建堆的过程 2)开始建堆:采用筛选法,逐步将大的关键字筛到堆底。 筛选法的思想是这样的: ? 假设集合r有m个结点,从某个结点i(第一次 i=[m/2] )开始筛选; ? 先看第i个结点的左右子树,设第i个结点的左子树为kj ,右子树为kj+1。若kj kj+1则沿左分支筛,否则沿右分支筛选,即(j=j+1)。将ki与kj 进行比较,若ki kj则对调,小的上来大的下去。 ? 然后kj作为新的根结点,再对新的根结点的左右子树进行判断。重复上述过程,

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档