算法设计与分析实验报告 模板.docx
《算法设计与分析实验报告 模板.docx》由会员分享,可在线阅读,更多相关《算法设计与分析实验报告 模板.docx(7页珍藏版)》请在冰豆网上搜索。
![算法设计与分析实验报告 模板.docx](https://file1.bdocx.com/fileroot1/2023-5/26/c2e6d448-6c94-4448-8424-906165a60078/c2e6d448-6c94-4448-8424-906165a600781.gif)
算法设计与分析实验报告模板
实验报告
(2016/2017学年第一学期)
课程名称
算法分析与设计
实验名称
分治策略
实验时间
2016
年
10
月
18
日
指导单位
计算机学院软件教学中心
指导教师
季一木
学生姓名
周文超
班级学号
B14041527
学院(系)
计算机学院、软件学院
专业
软件工程
实验报告
实验名称
分治策略
指导教师
季一木
实验类型
验证
实验学时
2
实验时间
一、实验目的和任务
1.理解分治法的算法思想,阅读实现书上已有的部分程序代码并完善程序,加深对分治法的算法原理及实现过程的理解。
2.用分治法实现一组无序序列的两路合并排序和快速排序。
要求清楚合并排序及快速排序的基本原理,编程实现分别用这两种方法将输入的一组无序序列排序为有序序列后输出。
二、实验环境(实验设备)
算法设计与分析课本
笔记本电脑
VC++6.0
三、实验原理及内容(包括操作过程、结果分析等)
实验原理
运用分治法:
无序->部分有序->整体有序
归并排序中“分”与“合”的过程是结合在一起的,即每一趟都在做“分”与“合”的工作,并不是先“分”完再“合”
基本程序
(一)两路合并排序
#include
classSortableList{
public:
SortableList(intmSize)//构造函数
{
maxSize=mSize;
l=newint[maxSize];
n=0;
}
~SortableList(){delete[]l;}//析构函数
voidInput();
voidMerge(intleft,intmid,intright);
voidMergeSort();
voidMergeSort(intleft,intright);
voidOutput();
private:
int*l;//动态生成一维数组
intmaxSize;//线性表的最大表长
intn;//线性表的实际长度
};
voidSortableList:
:
Input(){
for(inti=0;icin>>l[i];
n++;
}
}
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++];
else
temp[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:
:
MergeSort(){
MergeSort(0,n-1);
}
voidSortableList:
:
MergeSort(intleft,intright){
if(leftintmid=(left+right)/2;//将待排序的序列一分为二
MergeSort(left,mid);//对左序列排序
MergeSort(mid+1,right);//对右序列排序
Merge(left,mid,right);//将两个有序子序列合并成一个有序序列
}
}
voidSortableList:
:
Output(){
for(inti=0;icout<}
}
voidmain(){
SortableListl(10);
cout<<"请输入10个数:
"<l.Input();
l.MergeSort();
cout<<"排序后是:
"<l.Output();
}
(二)快速排序
#include
classSortableList{
public:
SortableList(intmSize)//构造函数
{
maxSize=mSize;
l=newint[maxSize];
n=0;
}
~SortableList(){delete[]l;}//析构函数
voidInput();
voidSwap(inti,intj);
intPartition(intleft,intright);
voidQuickSort(intleft,intright);
voidQuickSort();
voidOutput();
private:
int*l;//动态生成一维数组
intmaxSize;//线性表的最大表长
intn;//线性表的实际长度
};
voidSortableList:
:
Input(){
for(inti=0;icin>>l[i];
n++;
}
}
voidSortableList:
:
Swap(inti,intj){
intc=l[i];
l[i]=l[j];
l[j]=c;
}
intSortableList:
:
Partition(intleft,intright){
//前置条件:
left<=right
inti=left,j=right+1;
do{
doi++;while(l[i]doj--;while(l[j]>l[left]);
if(i}while(iSwap(left,j);
returnj;
}
voidSortableList:
:
QuickSort(){
QuickSort(0,n-1);
}
voidSortableList:
:
QuickSort(intleft,intright){
if(leftintj=Partition(left,right);//对[left,right]范围内的序列进行分划
QuickSort(left,j-1);//对左子序列实施快速排序
QuickSort(j+1,right);//对右子序列实施快速排序
}
}
voidSortableList:
:
Output(){
for(inti=0;icout<}
}
voidmain(){
SortableListl(10);
cout<<"请输入10个数:
"<l.Input();
l.QuickSort();
cout<<"排序后是:
"<l.Output();
}
实验结果
两路合并排序
快速排序
六、实验小结(包括问题和解决方法、心得体会等)
合并排序的基本运算是把两个或多个有序序列合并成一个有序序列。
快速排序又称分划交换排序,分别将两个子序列拍成有序序列,则整个序列也就成了有序序列。
首先要掌握基本的排序思想,然后把逻辑语言转化成程序语言,参考网上的各种答案优化自己的算法程序结合所学知识。
七、指导教师评语
成绩
批阅人
日期