数据结构 第十章-排序.ppt

  1. 1、本文档共88页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
从大到小的序列为:(89,78,75,71,68,44,33,14,8) 练习: 已知待排序的序列为(503,87,512,61,908,170,897,275,653,462)。(1)建立一个堆(画出第一步和最后堆的结果图),希望先输出最小值。(2)输出最小值后,如何得到次小值。(并画出相应结果图) 10.5 归并排序 基本思想:把k(k≥2)个有序子文件合并在一起,形成一个新的有序文件。同时归并k个有序子文件的排序过程称为k-路归并排序。 2-路归并排序: 归并2个有序子文件的排序。 例. 将有序文件A和A归并为有序文件C。 A=(2,10,15,18,21,30) B=(5,20,35,40) 按从小至大的次序从A或B中依次取出 2,5,10,15,...,40, 顺序归并到C中,得: C=(2,5,10,15,18,20,21,30,35,40) 一般地,2-路归并过程为: 假定文件r[low..high]中的相邻子文件(子表) (r[low],r[low+1],...,r[mid])和(r[mid+1],...,r[high]) 为有序子文件,其中:low≤midhigh 。 将这两个相邻有序子文件归并为有序文件y[low..high],即: (y[low],y[low+1],...,y[high]) 06 08 15 40 07 09 20 22 r[9..16] 9 10 11 12 13 14 15 16 06 07 08 09 15 20 22 40 y[9..16] 9 10 11 12 13 14 15 16 2-路归并 有序文件(表) i→ j→ k→ 例 有序 子表 有序 子表 将两个有序子文件归并为有一个有序文件的算法 void merge(r,y,low,mid,high) RecType r[],y[];int low,mid,high; { int k=i=low,j=mid+1; while (i=mid j=high) { if (r[i].key=r[j].key) { y[k]=r[i]; //归并前一个子文件的记录 i++;} else    { y[k]=r[j]; //归并后一个子文件的记录 j++;}   k++; } while (j=high) //归并后一个子文件余下的记录 { y[k]=r[j]; j++; k++;   } while (i=mid)  //归并前一个子文件余下的记录 { y[k]=r[i]; i++; k++; } } // merge 2-路归并排序 假定文件(r[1],r[2],...,r[n])中记录是随机排列的,进行2-路归并排序,首先把它划分为长度均为1的n个有序子文件,然后对它们逐步进行2-路归并排序。其步骤如下: 第1趟:从r[1..n]中的第1个和第2个有序子文件开始,调用算法merge,每次归并两个相邻子文件,归并结果放到y[1..n]中。在y中形成 ?n/2? 个长度为2的有序子文件。若n为奇数,则y中最后一个子文件的长度为1。 第2趟:把y[1..n]看作输入文件,将 ?n/2? 个有序子文件两两归并,归并结果回送到r[1..n]中,在r中形成 ??n/2?/2?个长度为4的有序子文件。若y中有奇数个子文件,则r中最后一个子文件的长度为2。 ...... 共计经过 ?log2n? 趟归并,最后得到n个记录的有序文件。 06 44 20 10 02 20 08 07 1 2 3 4 5 6 7 8 r[1..8] 06 44 10 20 02 20 07 08 1 2 3 4 5 6 7 8 y[1..8] 06 10 20 44 02 07 08 20 1 2 3 4 5 6 7 8 r[1..8] 02 06 07 08 10 20 20 44 1 2 3 4 5 6 7 8 y[1..8] 第1趟 第3趟 第2趟 例1.对8个记录作2路归并排序,共进行?log28?=3 趟归并。 例2. 对11个记录作2-路归并排序,进行?log211?=4趟归并。 06 44 20 10 02 20 08 07 05 32 14 1 2 3 4 5 6 7 8 9 10 11 r[1..11] 06 44

文档评论(0)

文档精品 + 关注
实名认证
内容提供者

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

版权声明书
用户编号:6203200221000001

1亿VIP精品文档

相关文档