最大值最小值实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最大值最小值实验报告
一、实验目的
1、掌握如何用分治法求最大值和最小值
2、学会分析递归算法的时间复杂度
3、学会用分治法解决实际问题
二、实验内容
随机产生一个整型的数组,然后用分治法分别求出数组的最大值和最小值,输出最大值和最小值。
三、实验环境
程序设计语言:C++
操作系统:Windows 7
编程工具:Microsoft Visual Studio 2010专业版
四、程序源代码
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
constint MAXN = 100;
int Partition(int *a, int low, int high)
{
int key = a[low];
while(low < high)
{
while(low < high && a[high] >= key)
--high;
if(low < high)
a[low++] = a[high];
while(low < high && a[low] <= key)
++low;
if(low < high)
a[high--] = a[low];
}
a[low] = key;
return low;
}
int Max(int *A, int left, int right)
{
if(left == right)
return A[left];
else
{
intpivotloc = Partition(A, left, right);
if(pivotloc == right)
return A[pivotloc];
return Max(A, pivotloc + 1, right); //最大值一定在pivotloc的右边
}
}
int Min(int *A, int left, int right)
{
if(left == right)
return A[left];
else
{
intpivotloc = Partition(A, left, right);
if(pivotloc == left)
return A[pivotloc];
return Min(A, left, pivotloc - 1); //最大值一定在pivotloc的右边
}
}
int main()
{
srand(time(NULL));
int a[MAXN];
int n = rand() % 100 + 1; //随机产生数组的长度n,1-100 cout<< "数列的个数:" << n <<endl;
for(inti = 0; i< n; i++)
{ //随机产生数组的各个元素
a[i] = rand() % 100 + 1;
cout<< a[i] << ' ';
}
cout<<endl;
cout<< "Max:" << Max(a, 0, n - 1) <<endl;
cout<< "Min:" << Min(a, 0, n - 1) <<endl;
}
五、实验结果截图
上图只不过是很多结果中的一个,通过对大量数据的测试,发现这个程序是正确的。
六、实验总结
刚开始这个题目所用的方法是在把数组二分,然后分别求两个子问题的最大值最小值,然后合并,最后得到整个数组的
最大值和最小值。
后来,经过老师的指导,发现用类似快速排
序的那种分组的方法更好,效率会更高,就换了一种写法。
这次课程设计给我最深的体会是:学算法不能仅仅通过看书,一定要上机实践,只有上机才能真正的理解一个算法,而
且还能提高自己的编程能力。
有很多算法其实是相通的,要灵
活的应用已经学过的算法。