算法实验报告.docx
《算法实验报告.docx》由会员分享,可在线阅读,更多相关《算法实验报告.docx(17页珍藏版)》请在冰豆网上搜索。
算法实验报告
实验名称:
分治法合并排序
实验时间:
2017.3.24
实验目的和要求:
1.掌握合并排序的基本思想
2.掌握合并排序的实现方法
3.学会分析算法的时间复杂度
4.学会用分治法解决实际问题
实验内容和原理:
随机产生一个整型数组,然后用合并排序将该数组做升序排列,要求输出排序前和排序后的数组。
主要仪器设备:
名称:
Inspiron157000系列(游匣7000)(湛黑)
编译器:
VisualStudioCommunity2015
系统:
win8.0
上机调试修改源程序:
#include"stdafx.h"
#include"iostream"
usingnamespacestd;
voidMerge(int*l,int*temp,intleft,intmid,intright)
{intk=0;
inti=left,j=mid+1;//避免重复比较l[mid]
mid=(left+right)/2;
while((i<=mid)&&(j<=right))
//数组l(mid,right]与数组l(mid,right]均没有全部归入数组temp中去
{if(l[i]<=l[j])//将较小的数放入中间数组
{temp[k++]=l[i++];}
else
{temp[k++]=l[j++];}
}
while(i<=mid)
//表示数组l(mid,right]已经全部归入temp数组中去了,而数组l[left,right]还有剩余
{//将数组l[left,right]剩下的值,逐一归入数组temp
temp[k++]=l[i++];
}
while(j<=right)
{temp[k++]=l[j++];}
for(i=0;il[left+i]=temp[i];
}
voidMergesort(int*l,int*temp,intleft,intright)//分化函数并调用合并函数
{if(leftintmid=(left+right)/2;
Mergesort(l,temp,left,mid);//左边有序
Mergesort(l,temp,mid+1,right);//右边有序
Merge(l,temp,left,mid,right);//再将两个有序序列合并
}
}
intmain()
{intLength;
cout<<"输入产生数组的个数:
";
cin>>Length;
int*l=newint[Length];//新建数组
cout<<"产生的随机数组为:
"<for(inti=0;i{
l[i]=(rand()%(100-0+1))+0;//调用随机函数产生0-100的随机数
cout<};
if(inti=Length){cout<int*p=newint[Length];
Mergesort(l,p,0,Length-1);
cout<<"排序后的数组为:
"<for(intt=0;t{cout<cout<delete[]p;
return0;
}
实验结果与分析
。
分析:
二路合并排序是分治算法。
它将一个序列分解成两个长度几乎相等的子序列,对它们分别排序,然后调用merge函数合并成一个有序子序列。
基本运算是元素比较,时间复杂度O(nlogn)。
使用与原序列相同长度的辅助数组temp,所需额外空间O(n)
讨论,心得(可选):
能够掌握分治法的步骤,划分,求解子问题,合并。
对分治问题有了更深的体会。
它是将原问题划分为彼此相互独立,规模较小可求解的子问题。
实验名称:
贪心法作业调度
实验时间:
2017.3.31
实验目的和要求:
1.掌握贪心算法的基本思想
2.掌握贪心算法的典型问题求解
3.进一步多机调度的基本思想和算法设计方法
4.学会用贪心法分析和解决实际问题
实验内容和原理:
设计贪心算法实现作业调度,要求按作业调度顺序输出作业序列。
如已知要处理的作业数n=8,作业完成的期限为 d=(4, 2, 4, 5, 6, 4, 5, 7),其效益值自行给定,求该条件下的最大效益。
主要仪器设备:
名称:
Inspiron157000系列(游匣7000)(湛黑)
编译器:
VisualStudioCommunity2015
系统:
win8.0
上机调试修改源程序:
#include"stdafx.h"
#include"iostream"
#definen8
usingnamespacestd;
voiddisplay(int*x,int*p,int*d)//输出函数
{intt;
for(t=0;t{if((t+1)%4==0)//每行4组
cout<<"【"<else{cout<<"【"<}
}
intmain()
{intd[n]={4,2,4,5,6,4,5,7};//时限
intp[n]={1,3,5,7,2,4,6,8};//效益值
intx[n]={0,1,2,3,4,5,6,7};//序号
inttime[n]={-1,-1,-1,-1,-1,-1,-1,-1};
inti,j;//虚时间片初始都空
cout<<"初始数据【序号】(效益值,时限):
"<display(x,p,d);
/*效益值非递增排序函数*/
intt1,t2;
for(i=0;ifor(j=0;j{if(p[j+1]>p[j])
{t1=p[j+1];p[j+1]=p[j];p[j]=t1;//效益值新排序
t2=x[j+1];x[j+1]=x[j];x[j]=t2;//序号新排序
}
}
cout<<"排序后数据【序号】(效益值,时限):
"<display(x,p,d);
/*FJS(引入虚时间片数组time)*/
cout<<"作业可行解是:
X=(";
intW=0;//初始效益值是0
for(i=0;i{intday=d[x[i]];//每个作业都放在可最晚执行的虚时间片内
for(j=day-1;j>=0;j--)//若非空则向前寻找
if(time[j]==-1)
{W+=p[i];//求最大效益值
time[j]=x[i];//标记时间片非空
cout<break;
}//一旦找到满足的位置就输出并退出循环
}//找不到就不输出
cout<<")"<cout<<"作业的调度顺序是:
X=(";
for(i=0;iif(time[i]!
=-1)cout<