交换法排序的具体实现和性能分析.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
8.1 排序的基本概念 8.1.2 排序算法的效率分析 8.2 插入排序 8.2.1 直接插入排序 8.2.2 折半插入排序 8.2.3 希尔排序 8.3交换排序 8.3.3 快速排序 8.4选择排序 8.4.2 堆排序 8.5归并排序 8.6基数排序 8.7外部排序 8.7.1外部排序过程 8.7.2多路平衡归并 8.7.3置换一选择排序 8.8各种排序方法的比较 本章小结 【例8-11】设文件中共有18个记录,记录的关键字分别为{15,4,97,64,17,32,108,44,76,9,39,82,56,3l,80,73,255,68},内存工作区可容纳5个记录。 【解】初始归并段的生成过程如表8-1所示。 (e) 重建堆,筛选56下移两层 (f)交换24和48 (g) 重建堆,筛选48下移一层 (h)交换37和61 (i) 重建堆,筛选61下移一层 (j) 交换37和56 (k)重建堆,筛选56下移一层 (l) 交换48和61 (m) 重建堆,筛选61下移一层 (n) 交换56和61 图8-10 堆排序示例 对堆排序算法主要由建立初始堆和反复重建堆两部分构成,它们均通过调用Sift()实现。假设具有n个记录的初始序列对应的完全二叉树的深度为h= ,则在建立初始堆时,对每一个非叶子结点都要从上到下做“筛选”,则建立初始堆的总比较次数C1为: ≤ 其时间复杂度为O(n)。n个结点完全二叉树的深度为 ,n-1次建新堆的总比较次数C2为: ≤ ≤ 堆排序所需的关键字比较的总次数是: + = O(nlog2n) 类似地,可求出堆排序所需的记录移动的总次数为:O(nlog2n),因此堆排序的最坏时间复杂度为O(nlog2n)。堆排序算法一般适合于待排序记录数比较多的情况。 堆排序需要一个辅助空间,所以空间复杂度为O(1)。 堆排序也是不稳定排序。 归并排序(Merge Sort)也是一种常用的排序方法,“归并”的含义是将两个或两个以上的有序表合并成一个新的有序表。如图8-11为两组有序表的归并,有序表{4,25,34,56,69,74}和{15,26,34,47,52},通过归并把它们合并成一个有序表{4,15,25,26,34,34, 47,52, 56,69,74}。 图8-11 两组有序表的归并 二路归并排序的基本思想是:将有n个记录的待排序列看作n个有序子表,每个有序子表的长度为1,然后从第一个有序子表开始,把相邻的两个有序子表两两合并,得到n/2个长度为2或1的有序子表(当有序子表的个数为奇数时,最后一组合并得到的有序子表长度为1),这一过程称为一趟归并排序。再将有序子表两两归并,如此反复,直到得到一个长度为n的有序表为止。上述每趟归并排序都需要将相邻的两个有序子表两两合并成一个有序表,这种归并方法称为二路归并排序。 1.两个有序表的合并算法Merge( )。 设线性表R[low..m],和R[m+1..high]是两个已排序的有序表,存放在同一数组中相邻的位置上,将它们合并到一个数组Rl中,合并过程如下: (1) 比较线性表R[low..m]与R[m+1..high]的第一个记录,将其中关键字值较小的记录移入表R1(如果关键字值相同,可将R[low..m]的第一个记录移入R1中)。 (2) 将关键字值较小的记录所在线性表的长度减1,并将其后继记录作为该线性表的第一个记录。 反复执行上述过程,直到线性表R[low..m]或R[m+1..high]之一成为空表,然后将非空表中剩余的记录移入R1中,此时Rl成为一个有序表。 算法描述如下: void Merge(RecType R[],RecType R1[],int low,int m,int high) { //R[low..m]和R[m+1..high]是两个有序表 int i=low, j=m+l, k=low; //k是Rl的下标,i、j分别为R[low..m]和R[m+1..high]的下标 while(i=mj=high){ //在R[low..m]和R[m+1..high]均未扫描完时循环 if(R[i].key=R[j].key){ //将R[low..m]中的记录放入R1中 R1[k]=R[i]; i++; k++; } else{ //将R[m+1..high]中的记录放入R1中 R1[k]=R[j]; j++; k++; }

文档评论(0)

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

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

1亿VIP精品文档

相关文档