算法分治策略.docx

上传人:b****3 文档编号:2385113 上传时间:2022-10-29 格式:DOCX 页数:10 大小:17.03KB
下载 相关 举报
算法分治策略.docx_第1页
第1页 / 共10页
算法分治策略.docx_第2页
第2页 / 共10页
算法分治策略.docx_第3页
第3页 / 共10页
算法分治策略.docx_第4页
第4页 / 共10页
算法分治策略.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

算法分治策略.docx

《算法分治策略.docx》由会员分享,可在线阅读,更多相关《算法分治策略.docx(10页珍藏版)》请在冰豆网上搜索。

算法分治策略.docx

算法分治策略

实验报告

(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,ri

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1