算法分治策略Word格式文档下载.docx
《算法分治策略Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《算法分治策略Word格式文档下载.docx(10页珍藏版)》请在冰豆网上搜索。
学院(系)
计算机学院
专业
软件工程
实验类型
验证型(第4个实验密码算法是“设计型”)
实验学时
2
2017-3-30
一、实验目的和任务
理解分治法的算法思想,阅读实现书上已有的部分程序代码并完善程序,加深对分治法的算法原理及实现过程的理解
二、实验环境(实验设备)
VisualStudio2015
三、实验原理及内容(包括操作过程、结果分析等)
一、用分治法实现一组无序序列的两路合并排序和快速排序。
要求清楚合并排序及快速排序的基本原理,编程实现分别用这两种方法将输入的一组无序序列排序为有序序列后输出。
标头.h
#include<
iostream>
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(){delete[]l;
voidSortableList:
Input()
cout<
<
"
请输入待排序的数组\n"
;
for(inti=0;
i<
maxSize;
i++){
cin>
>
l[i];
if(l[i]==-1)
break;
n++;
}
Output()
n;
i++)
cout<
l[i]<
MergeSort(){MergeSort(0,n-1);
QuickSort(){QuickSort(0,n-1);
MergeSort(intleft,intright)
if(left<
right){
intmid=(left+right)/2;
MergeSort(left,mid);
MergeSort(mid+1,right);
Merge(left,mid,right);
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++];
Swap(inti,intj)
intc=l[i];
l[i]=l[j];
l[j]=c;
QuickSort(intleft,intright)
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]<
l[left]);
doj--;
while(l[j]>
if(i<
j)Swap(i,j);
}while(i<
j);
Swap(left,j);
returnj;
源.app
#include"
标头.h"
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个最小的元素,使其在线性时间内解决。
enumResultCode{OutOfBounds,Success};
ResultCodeSelect(int&
x,intk);
voidInsertSort(intleft,intright);
intPartition(intleft,intright);
intSelect(intk,intleft,intright,intr);
请输入带排序的数组\n"
Partition(intleft,intright)
ResultCodeSortableList:
Select(int&
x,intk)
if(n<
=0||k>
n||k<
=0)returnOutOfBounds;
intj=Select(k,0,n-1,5);
x=l[j];
returnSuccess;
Select(intk,intleft,intright,intr)
intn=right-left+1;
=r){//若问题足够小,使用直接插入排序
InsertSort(left,right);
returnleft+k-1;
//取其中的第k小元素,其下标为left+k-1
for(inti=1;
=n/r;
{
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);
//二次中间值为枢纽元,并换至left处
j=Partition(left,right);
//对表(子表)进行分划操作
if(k==j-left+1)
returnj;
//返回第k小元素下标
elseif(k<
j-left+1)
returnSelect(k,left,j-1,r);
//在左子表求第k小元素
elsereturnSelect(k-(j-left+1),j+1,right,r);
//在右子表求第k-(j-left+1)小元素
InsertSort(intleft,intright)
for(inti=left+1;
intj=i;
inttemp=l[i];
while(j>
left&
temp<
l[j-1]){
l[j]=l[j-1];
j--;
l[j]=temp;
源.cpp
intx=4;
SortableListmyl(n);
myl.Input();
myl.Select(x,4);
myl.Output();
四、实验小结(包括问题和解决方法、心得体会等)
1、通过实现快排和两路合并排序,加深了对相关知识的理解。
2、通过五元中值组取中值分割法在实际例子中体验了分治法的应用范围和优势。
五、指导教师评语
成绩
批阅人
日期