算法分析与设计第四章(分治法快速分类)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
划分实例(1次划分)
Partition(m,p)=P划ar分tit元io素n(1,10)
p=5
1 2 3 4 5 6 7 8 9 10 i P 65 70 75 80 85 60 55 50 45 10000 2 9 65 45 75 80 85 60 55 50 70 10000 3 8 65 45 50 80 85 60 55 75 70 10000 4 7 65 45 50 55 85 60 80 75 70 10000 5 6 65 45 50 55 60 85 80 75 70 10000 6 5 60 45 50 55 65 85 80 75 70 10000 5
2008-09-01
版权所有:杨波,武汉科技大学理学院
快速分类分析
统计的对象:元素的比较次数,记为:C(n) 两点假设
参加分类的n个元素各不相同 Partition中的划分元素v是随机选取的(针对平均情况
的分析)
随机选取划分元素: 在划分区间[m,p-1]随机生成某一坐标:
i←Random(m,p-1); 调换a[m]与a[i];v←a[i];a[i]←a[m];i←m+1;
作用:将随机指定的划分元素的值调换到 a[m]
位置。算法主体不变。之后,仍从a[m]开始执行划分
操作。
2008-09-01
版权所有:杨波,武汉科技大学理学院
现在t以后的元素均大于等于t。这一元 素的整理过程称为
2008-09-01
版权所有:杨波,武汉科技大学理学院
快速分类的基本思想
对于输入的子数组a[m:p-1],按以下3个步 骤进行排序:
分解(divide):以a[m]为基准元素(假定第一 个元素a[m]是划分元素)将a[m:p-1]分成3段 a[m:q-1],a[q]和a[q+1:p-1],使得a[m:q-1]中任 何元素小于等于a[q],a[q+1:p-1]中任何元素大 于等于a[q],下标q 在划分过程中确定。
int j;
if(p<q)
{ j=q+1;//每次执行Partition时使用一个右侧附加空间[p:q]等同与[m:p-1] //m=p;p-1=q; j=Partition(p,j);//j是划分元素的位置 QuickSort(p,j-1);//对左半段排序 QuickSort(j+1,q);//对右半段排序
经过Partition算法之后进行
{ temp=a[i]; a[i]=a[p]; a[p]=temp; }
从小到大排列,引入a[p]则
else break;
程序易于实现)
}
a[m]=a[p];a[p]=v; //划分元素在位置p
return p;
}
2008-09-01
版权所有:杨波,武汉科技大学理学院
2008-09-01
版权所有:杨波,武汉科技大学理学院
经过一次“划分”后,实现了对集合元素的调整:
以划分元素为界,左边子集合的所有元素均 小于等于右边子集合的所有元素。
按同样的策略对两个子集合进行分类处理。 当子集合分类完毕后,整个集合的分类也完成了。 这一过程避免了子集合的归并操作。这一分类方 法称为快速分类。
}
}
2008-09-01
版权所有:杨波,武汉科技大学理学院
全部分类过程
123456789 1 [65 70 75 80 85 60 55 50 45] 2 [60 45 50 55] 65 [85 80 75 70] 3 [55 45 50] 60 65 [85 80 75 70] 4 [50 45] 55 60 65 [85 80 75 70] 5 [45] 50 55 60 65 [85 80 75 70] 6 45 50 55 60 65 [85 80 75 70] 7 45 50 55 60 65 [70 80 75] 85 8 45 50 55 60 65 70 [80 75] 85 9 45 50 55 60 65 70 [75] 80 85 10 45 50 55 60 65 70 75 80 85
则在重排完成之后,
//对于m和p-1之间的某个q,有a[q]=t,并使得对于m≤k≤q,有a[k] ≤t,而对于 q<k<p,有a[k] ≥t。
//退出时返回值为划分元素所在的下标位置
int i,v;//v为划分元算素法,对i为集从合左到右计数,p从右到左计数
v=a[m];i=m+1;p=ap[-m1;:p-1]进行 int temp;//临时交划换分单元 while(true)
2008-09-01
版权所有:杨波,武汉科技大学理学院
快速分类算法
public static void QuickSort(int p,int q) {//将全程数组a[1:n]中的元素a[p],…,a[q]按递增的方式分类。 //认为a[n+1]已被定义,且大于或等于a[p:q]的所有元素;即a[n+1]=+∞
a[p]被定义,但为一限界值
{
a[p]≥a[m] ,不包含在实际
wwhhiillee((aa[[ip元]]<>素vv))api[+-m-+;];/作///直直为到到划不不分大小元于于素vv,p,i向向左右移移动动
的分类区间内。(技巧:假 如是按照从大到小排列,
if(i<p) //a[i]与a[p]交换位置
第四章 分治法
2008-09-01
版权所有:杨波,武汉科技大学理学院
§4.5 快速分类
1.划分与快速分类
快速分类是一种基于划分的分类方法;
划分:选取待分类集合A中的某个元素t,按照 与t的大小关系重
新整理A中元素,使得整理后t被置于序 列的某位置上,
而序列中所有在t以前出现的元素均小于 等于t,而所有出
递归求解(conquer):通过递归调用快速排序 算法,分别对a[m:q-1]和a[q+1:p-1]进行排序。
合并(merge):由于Байду номын сангаас a[m:q-1]和a[q+1:p-1]的
2008-09-01
版权所有:杨波,武汉科技大学理学院
划分过程的算法描述
public static int Partition(int m,int p) {//在a[m],a[m+1],…,a[p-1]中的元素按如下方式重新排列:如果最初t=a[m],