数据结构教学课件ppt作者主编马世霞第8章排序课件.pptVIP

数据结构教学课件ppt作者主编马世霞第8章排序课件.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结构教学课件ppt作者主编马世霞第8章排序课件.ppt

8.4.2 堆排序 8.4.2 堆排序 8.4.2 堆排序 void sift(int a[],int low,int high) /*堆排序*/ { int i=low,j=2*i; /*a[j]是a[i]的左孩子*/ int temp=a[i]; while (j=high) { if (jhigh a[j]a[j+1]) j++; if (tempa[j]) {a[i]=a[j]; /*将a[j]调整到双亲结点位置上*/ i=j; /*修改i和j值,以便继续向下筛选*/ j=2*i; } else break; /*筛选结束*/ } a[i]=temp; /*被筛选结点的值放入最终位置*/ } void HeapSort(int a[],int n) { int i,temp; for (i=n/2;i=1;i--) /*循环建立初始堆*/ sift(a,i,n); for (i=n;i=2;i--) /*进行n-1次循环,完成推排序*/ { temp=a[1]; a[1]=a[i];a[i]=temp; /*将第1个元素同当前区间内a[1]对换*/ sift(a,1,i-1); /*筛选a[1]结点,得到i-1个结点的堆*/ } } 8.4.2 堆排序 注意,没有一种排序方法的效率是在任何情况下都能独占鳌头的,具体采取哪种方法要根据实际情况而定。 假设在10000个随机的数据中找出最大的10个数,那么采用堆排序应该是最合适的,因为: 第一,经验指出堆排序是一个非常稳定的算法,在各种环境中 其效率变化不会太大; 第二,堆排序的特性决定了只要构建一棵根节点为最大数的优先队列树,然后取其前10个根节点就行了。 【例8-1】编程实现数据的排序。 8.5 二路归并排序 归并排序:多次将两个或两个以上的有序表合并成一个新的有序表。最简单的归并是直接将两个有序的子表合并成一个有序的表。 假设初始序列含有n个记录,则可看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个长度为2或1的有序子序列;再两两归并,如此重复,如图所示。 二路归并排序的基本操作是将两个有序表合并为一个有序表。 8.5 二路归并排序 将有序文件a[low..mid]和a[mid+1..high]归并为b[low..high]的算法 void Merge(int a[], int low, int mid, int high) /*实现一趟归并排序*/ { int b[MaxSize],i, j, k; i=low, j=mid+1, k=0; /*置初始值*/ while(i=mid j=high) { if(a[i]=a[j]){b[k]=a[i]; i++; k++;} else {b[k]=a[j]; j++; k++;} } while(i=mid) {b[k]=a[i]; i++; k++;} while(j=high) {b[k]=a[j]; j++; k++;} for(k=0,i=low;i=high;k++,i++) a[i]=b[k]; /*排序完成*/ } void Merge_Sort(int a[],int low,int high) { int mid; if(lowhigh) /*区间长度大于1*/ { mid=(low+high)/2; Merge_Sort (a,low,mid); Merge_Sort (a,mid+1,high); Merge(a,low,mid,high); } } 8.5 二路归并排序 对n个元素的表,将这n个元素看作叶结点,若将两两归并生成的子表看作它们的父结点,则归并过程对应由叶向根生成一棵二叉树的过程。 所以归并趟数约等于二叉树的高度-1,即log2n,每趟归并需移动记录n次,故时间复杂度为O(nlog2n)。 【例8-2】编程,实现二路归并排序。 8.6 基数排序 基数排序:一种借助于多关键码排序的思想,是将单关键码按基数分成“多关键码”进行排序的方法。 1.多关键码排序 2. 链式基数排序 8.6 基数排序 【例8-3】设待排序的表有10个记录,说明采用基数排序方法进行排序的过程。其关键字为{178,109,063,930,589,184,505,26

文档评论(0)

带头大哥 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档