算法分治策略.docx
- 文档编号:6590112
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:10
- 大小:26.40KB
算法分治策略.docx
《算法分治策略.docx》由会员分享,可在线阅读,更多相关《算法分治策略.docx(10页珍藏版)》请在冰豆网上搜索。
算法分治策略
实验报告
(2016/2017学年第二学期)
课程名称
算法分析与设计
实验名称
分治策略
实验时间
2017
年
3
月
30
日
指导单位
计算机学院软件工程系
指导教师
张怡婷
学生姓名
霍淇滨
班级学号
B15041236
学院(系)
计算机学院
专业
软件工程
实验报告
实验名称
分治策略
指导教师
张怡婷
实验类型
验证型(第4个实验密码算法是“设计型”)
实验学时
2
实验时间
2017-3-30
一、实验目的和任务
理解分治法的算法思想,阅读实现书上已有的部分程序代码并完善程序,加深对分治法的算法原理及实现过程的理解
二、实验环境(实验设备)
VisualStudio2015
三、实验原理及内容(包括操作过程、结果分析等)
一、用分治法实现一组无序序列的两路合并排序和快速排序。
要求清楚合并排序及快速排序的基本原理,编程实现分别用这两种方法将输入的一组无序序列排序为有序序列后输出。
标头.h
#include
usingnamespacestd;
classSortableList
{
public:
SortableList(intmSize);
~SortableList();
voidInput();//输入数组
voidOutput();//输出数组
voidMergeSort();//两路合并排序
voidQuickSort();//快速排序
private:
int*l;//数组指针
intmaxSize;//数组最大长度
intn;//数组已有元素个数
voidMergeSort(intleft,intright);
voidMerge(intleft,intmid,intright);
voidSwap(inti,intj);//交换函数
voidQuickSort(intleft,intright);
intParition(intleft,intright);//分割函数
};
SortableList:
:
SortableList(intmSize)
{
maxSize=mSize;
l=newint[maxSize];
n=0;
}
SortableList:
:
~SortableList(){delete[]l;}
voidSortableList:
:
Input()
{
cout<<"请输入待排序的数组\n";
for(inti=0;i cin>>l[i]; if(l[i]==-1) break; n++; } } voidSortableList: : Output() { for(inti=0;i cout< } voidSortableList: : MergeSort(){MergeSort(0,n-1);} voidSortableList: : QuickSort(){QuickSort(0,n-1);} voidSortableList: : MergeSort(intleft,intright) { if(left intmid=(left+right)/2; MergeSort(left,mid); MergeSort(mid+1,right); Merge(left,mid,right); } } voidSortableList: : Merge(intleft,intmid,intright) { int*temp=newint[right-left+1]; inti=left,j=mid+1,k=0; while((i<=mid)&&(j<=right)) if(l[i]<=l[j])temp[k++]=l[i++]; elsetemp[k++]=l[j++]; while(i<=mid)temp[k++]=l[i++]; while(j<=right)temp[k++]=l[j++]; for(i=0,k=left;k<=right;)l[k++]=temp[i++]; } voidSortableList: : Swap(inti,intj) { intc=l[i]; l[i]=l[j]; l[j]=c; } voidSortableList: : QuickSort(intleft,intright) { if(left intj=Parition(left,right); QuickSort(left,j-1); QuickSort(j+1,right); } } intSortableList: : Parition(intleft,intright) { inti=left,j=right+1; do{ doi++;while(l[i] doj--;while(l[j]>l[left]); if(i }while(i Swap(left,j); returnj; } 源.app #include #include"标头.h" usingnamespacestd; voidmain() { intn=10; SortableListmy1(n); SortableListmy2(n); my1.Input(); my2.Input(); my1.MergeSort(); my2.QuickSort(); my1.Output(); my2.Output(); } 二、采用基于“五元中值组取中值分割法”(median-of-median-of-fivepartitioning)的线性时间选择算法,找出N个元素集合S中的第k个最小的元素,使其在线性时间内解决。 标头.h #include usingnamespacestd; enumResultCode{OutOfBounds,Success}; classSortableList { public: SortableList(intmSize); ~SortableList(); voidInput(); voidOutput(); ResultCodeSelect(int&x,intk); private: int*l; intmaxSize; intn; voidSwap(inti,intj); voidInsertSort(intleft,intright); intPartition(intleft,intright); intSelect(intk,intleft,intright,intr); }; SortableList: : SortableList(intmSize) { maxSize=mSize; l=newint[maxSize]; n=0; } SortableList: : ~SortableList(){delete[]l;} voidSortableList: : Input() { cout<<"请输入带排序的数组\n"; for(inti=0;i cin>>l[i]; if(l[i]==-1) break; n++; } } voidSortableList: : Output() { for(inti=0;i cout< } voidSortableList: : Swap(inti,intj) { intc=l[i]; l[i]=l[j]; l[j]=c; } intSortableList: : Partition(intleft,intright) { inti=left,j=right+1; do{ doi++;while(l[i] doj--;while(l[j]>l[left]); if(i }while(i Swap(left,j); returnj; } ResultCodeSortableList: : Select(int&x,intk) { if(n<=0||k>n||k<=0)returnOutOfBounds; intj=Select(k,0,n-1,5); x=l[j]; returnSuccess; } intSortableList: : Select(intk,intleft,intright,intr) { intn=right-left+1; if(n<=r){//若问题足够小,使用直接插入排序 InsertSort(left,right); returnleft+k-1;//取其中的第k小元素,其下标为left+k-1 } for(inti=1;i<=n/r;i++) { InsertSort(left+(i-1)*r,left+i*r-1);//二次取中规则求每组的中间值 Swap(left+i-1,left+(i-1)*r+(int)ceil((double)r/2)-1);//将每组的中间值交换到子表前部集中存放 } //求二次中间值,其下标为j intj=Select((int)ceil((double)n/r/2),left,left+(n/r)-1,r); Swap(left,j);//二次中间值为枢纽元,并换至left处 j=Partition(left,right);//对表(子表)进行分划操作 if(k==j-left+1) returnj;//返回第k小元素下标 elseif(k returnSelect(k,left,j-1,r);//在左子表求第k小元素 elsereturnSelect(k-(j-left+1),j+1,right,r);//在右子表求第k-(j-left+1)小元素 } voidSortableList: : InsertSort(intleft,intright) { for(inti=left+1;i<=right;i++){ intj=i; inttemp=l[i]; while(j>left&&temp l[j]=l[j-1];j--; } l[j]=temp; } } 源.cpp #include"标头.h" voidmain() { intn=10; intx=4; SortableListmyl(n); myl.Input(); myl.Select(x,4); myl.Output(); } 四、实验小结(包括问题和解决方法、心得体会等) 1、通过实现快排和两路合并排序,加深了对相关知识的理解。 2、通过五元中值组取中值分割法在实际例子中体验了分治法的应用范围和优势。 五、指导教师评语 成绩 批阅人 日期
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 分治 策略