




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2008-09-01版权所有:杨波,武汉科技大学理学院 第四章第四章 分治法分治法2008-09-01版权所有:杨波,武汉科技大学理学院 4.4 4.4 归并分类归并分类n分类问题排序q对一个给定含有n个元素(又称为关键字)的集合,按一定次序进行分类(如非降次序)称称n元排序元排序。 q常见的排序方法:n冒泡排序n插入排序n归并排序n快速排序2008-09-01版权所有:杨波,武汉科技大学理学院 插入分类插入分类n基本思想for(j=2;j=n;j+) 将aj放到已分类集合a1:j-1的正确位置上 2008-09-01版权所有:杨波,武汉科技大学理学院 public static void i
2、nsertionsort(int a,int n) /将a1:n中的元素按非降次序分类,n1 int i,j; /循环计数变量 int item; /欲插入数据变量 for(j=2;j=1&item6,故9置于6之后i0123456ai-693415插入“3”:36,故6,9网后移,3置于原6的位置i0123456ai-369415插入“4”:346,故6,9往后移,4置于原6的位置i0123456ai-346915插入“1”:13,故3,4,6,9均往后移,1置于原3的位置i0123456ai-134695插入“5”:456,故6,9往后移,5置于原6的位置i0123456ai-13
3、45692008-09-01版权所有:杨波,武汉科技大学理学院 分治策略设计分治策略设计n算法的基本思想 :q将,1naa分成两个集合 2/,1 naa和,12/nanaq对每个集合单独分类 q将已分类的两个序列归并成一个含n个元素的分好类的序列 q这样一个分类过程称为归并分类2008-09-01版权所有:杨波,武汉科技大学理学院 归并分类算法归并分类算法void mergesort(int low,int high) /alow:high是一个全程数组,low和high分别指示当前待分类区间的最小下标和最大下标,含有high-low+10个待分类的元素 int mid; if(lowhigh
4、) /当含有2个及2个以上的元素时,作划分与递归处理 mid=(low+high)/2; /计算中分点 mergesort(low,mid); /在第一个子集合上分类(递归) mergesort(mid+1,high); /在第二个子集合上分类(递归) merge(low,mid,high); /归并已分类的两子集合 2008-09-01版权所有:杨波,武汉科技大学理学院 使用辅助数组归并两个已分类的集合的算法使用辅助数组归并两个已分类的集合的算法public void merge(int low,int mid,int high) int n,h,i,j,k; int b; n=a.leng
5、th; b=new intn;h=low;i=low;j=mid+1; while(h=mid)&(j=high) if(ahmid) for(k=j;k=high;k+) bi=ak;i+; else for(k=h;k=mid;k+) bi=ak;i+; for(k=low;k1, c是常数化简: 若n=2k,则有, t(n) =2(2t(n/4)+cn/2)+cn = 4t(n/4) + 2cn =4 (2t(n/8) +cn/4) + 2cn = =2kt(1)+kcn =an+cnlogn /k=logn所以得:t(n) = o(nlogn) 递归调用一直进行到子区间仅含一个
6、元素时为止复杂度分析复杂度分析t(n)=o(nlogn) 渐进意义下的最优算法11)()2/(2) 1 ()(nnnontont2008-09-01版权所有:杨波,武汉科技大学理学院 归并分类示例归并分类示例设a=(310,285,179,652,351,423,861,254,450,520)1)划分过程划分过程310,285,179,652,351,423,861,254,450,520310,285,179,652,351423,861,254,450,520310,285,179652,351310,285179310285652351423,861,254450,520423,861
7、2544238614505202008-09-01版权所有:杨波,武汉科技大学理学院 2)归并过程归并过程首先进入左分枝的划分与归并。 第一次归并前的划分状态是: (310 | 285 | 179 | 652,351 | 423,861,254,450,520)第一次归并:(285,310 | 179 | 652,351 | 423,861,254,450,520)第二次归并:(179,285,310 | 652,351 | 423,861,254,450,520)第三次归并:(179,285,310 |351,652 | 423,861,254,450,520)第四次归并:(179,285,
8、310,351,652 | 423,861,254,450,520)进入右分枝的划分与归并过程(略)2008-09-01版权所有:杨波,武汉科技大学理学院 3)用树结构描述归并分类过程)用树结构描述归并分类过程1,101,56,101,34,56,89,104,43,31,12,21,25,56,78,89,910,106,67,7mergesort(1,10)的调用1,1,26,6,71,2,34,4,56,7,89,9,101,3,56,8,101,5,10merge的调用2008-09-01版权所有:杨波,武汉科技大学理学院 310,285,179,652,351,423,861,254
9、,450,520310,285,179,652,351423,861,254,450,520310,285,179652,351310,285179310285652351423,861,254450,520423,861254423861450520285,310179,285,310351, 652179,285,310,351,652423,861254,423,861450,520254, 423,450,520,861179, 254, 285, 310,351,423,450,520 ,652 ,8612008-09-01版权所有:杨波,武汉科技大学理学院 归并分类的非递归算法归并
10、分类的非递归算法n设计思想2008-09-01版权所有:杨波,武汉科技大学理学院 2008-09-01版权所有:杨波,武汉科技大学理学院 public static void mergesort(int n,int datalength) /n为待合并数据个数为待合并数据个数 int i,t; /循环计数变量循环计数变量 i=1; /还有两段长度为还有两段长度为datalength的的list可合并可合并 while(i=(n-2*datalength+1) merge(i, i+datalength-1, i+2*datalength-1); i=i+2*datalength; if(i+d
11、atalengthn) /合并两段合并两段list,一段长度为,一段长度为datalength,另一段长度不足,另一段长度不足datalength merge(i, i+datalength-1, n); else /将剩下一段长度不足将剩下一段长度不足datalength的的list中的值不变中的值不变 2008-09-01版权所有:杨波,武汉科技大学理学院 例:要排序的数据如下i12345678910ai9876543210步骤1:length=1i12345678910ai8967452301步骤2:length=2i12345678910ai6789234501步骤3:length=4
12、i12345678910ai2345678901步骤4:length=8i12345678910ai01234567892008-09-01版权所有:杨波,武汉科技大学理学院 改进的归并分类算法改进的归并分类算法1)算法存在的问题n 递归层次太深 在mergesort的执行过程中,当集合仅含有两个元素时,仍要进一步做递归调用,直至每个集合仅含有一个元素时才退出递归调用。 在集合含有仅相当少的元素时,较深层次的递归调用使得时间过多地消耗在处理递归上。n 元素在数组a和辅助数组b之间的频繁移动 每次归并,都要首先将a中的元素移到b中,再由b复制到a的对应位置上。2008-09-01版权所有:杨波,
13、武汉科技大学理学院 2)改进措施n 针对递归层次问题 采用能在小规模集合上有效工作的其它算法,直接对小规模集合处理。 如insertsort算法n 针对元素频繁移动问题 采用一个称为链接信息数组link1:n的数据结构,记录归并过程中a的元素相对于其排序后在分类表中位置坐标的链接关系。 linki取值于1,n,是指向a的元素的指针:在分类表中它指向下一个元素在a中的位置坐标。0表示表的结束。2008-09-01版权所有:杨波,武汉科技大学理学院 n例:i12345678linki64713080n该表中含有两个子表,0表示表的结束。n设置表头指针q和r分别指向两个子表的起始处: q=2,r=5
14、; 则有, 表1:q(2,4,1,6),经过分类后有:a2a4a1a6 表2:r(5,3,7,8),同样有: a5a3a7a8 链接信息表在归并过程中的应用: 将归并过程中元素在a和b之间移动的过程变成更改link所指示的链接关系,从而避免移动元素的本身。 分类表可以通过link的表头指针和读取link中的链接关系取得。2008-09-01版权所有:杨波,武汉科技大学理学院 使用链接数组的归并分类模型使用链接数组的归并分类模型public static void mergesort1(int low,int high,int p)/利用辅助数组linklow:high将全程数组alow:hig
15、h按非降次序分类。 /link中值表示按分类次序给出a下标的表,并把p置于这表开始处 if(high-low+116) insertionsort(a,link,low,high,p) /当规模小于16时采用插入法 else mid=(low+high)/2; mergesort1(low,mid,q); /返回q表 mergesort1(mid+1,high,r); /返回r表 merge1(q,r,p); /将q和r归并成表p 2008-09-01版权所有:杨波,武汉科技大学理学院 使用链接表归并已分类的集合使用链接表归并已分类的集合 public static void merge1(i
16、nt q,int r,int p)/q和r是全程数组link1:n中两个表的指针。这两个表可用来获得全程数组a1:n中已分类元素的子集合。此算法执行后构造出一个由p所指示的新表,利用此表可以得到按非降次序把a中元素分好类的元素表,同时q和r所指示的表随之消失。假定表由0结束 int i,j,k; i=q;j=r;k=0;/新表在link0处开始 while(i!=0)&(j!=0)/当两表都非空时 if(ai=aj) linkk=i;k=i;i=linki; /找较小的关键字 else linkk=j;k=j;j=linkj; if(i=0) linkk=j; else linkk=i
17、; p=link0; 2008-09-01版权所有:杨波,武汉科技大学理学院 mergesort1 的调用 在初次调用时,待分类的n个元素放于a1:n中。 link1:n初始化为0; 初次调用: mergesort1(1,n,p) p作为按分类次序给出a中元素的指示表的指针。3)改进归并分类算法示例)改进归并分类算法示例 设元素表:(50,10,25,30,15,70,35,55) 采用mergesort1对上述元素表分类(不做小规模集合的单独处理) 下表给出在每一次调用mergesort1结束后,link数组的变化情况。2008-09-01版权所有:杨波,武汉科技大学理学院 i0123456
18、78ai50 10 25 30 15 70 35 55linki000000000qrp122201000000(10,50)343300400000(10,50),(25,30)232203410000(10,25,30,50)565503416000(10,25,30,50),(15,70)787703416080 (10,25,30,50),(15,70),(35,55)575503417086(10,25,30,50),(15,35,55,70)252285473016(10,15,25,30,35,50,55,70)在上表的最后一行,p=2返回,得到链表(2,5,3,4,7,1,8,
19、6)即:a(2)a(5)a(3)a(4)a(7)a(1)a(8)a(6)2008-09-01版权所有:杨波,武汉科技大学理学院 以比较为基础分类的时间下界以比较为基础分类的时间下界1) 分类的分类的“实质实质” 给定n个记录r1,r2,rn,其相应的关键字是k1,k2,kn。 分类就是确定1,2,n的一种排列p1,p2,pn,使得记录的关键字满足以下非递减(或非递增)排列关系 kp1kp2kpn 从而使n个记录成为一个按关键字有序的序列: rp1,rp2,rpn 2008-09-01版权所有:杨波,武汉科技大学理学院 2) 以关键字比较为基础的分类算法的时间下界以关键字比较为基础的分类算法的时间下界 最坏情况下的时间下界为:(nlogn)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 建筑装饰施工中的质量保证措施考核试卷
- 中药材种植的农业生态环境保护法制建设考核试卷
- 批发业务会计与财务管理考核试卷
- 文化空间营造考核试卷
- 体育运动训练中的运动康复技术考核试卷
- 体育航空运动飞行器空中交通管制操作考核试卷
- 宠物友好邮轮旅行船上宠物友好娱乐活动策划分享考核试卷
- 走路的安全课件
- 劳动合同补充合同范本
- 绿化租赁合同范本
- 河南省信阳市固始县2023-2024学年四年级下学期期末数学试题
- 新苏教版科学六年级下册全册教案(含反思)
- 原油电脱盐电脱水技术
- 国考断面水站建设及运维技术要求参考
- Q∕GDW 10799.7-2020 国家电网有限公司电力安全工作规程 第7部分:调相机部分
- 热工学后题答案
- 不吸烟不喝酒课件
- 奥数知识点 间隔问题
- 简易旋转倒立摆及控制装置
- 深圳大学《数字信号处理》2009年期末考试试卷A卷
- BMC缺陷以及原因
评论
0/150
提交评论