一、实验目的
1.
掌握各类数据结构的操作;
2.
掌握用
c++
语言描述与实现算法的方法;
3.
理解算法的概念,掌握算法复杂度分析技术;
二、实验内容
1.
运用
C
或
C++
语言,按要求完成算法实现;
2.
对所设计的算法采用大
O
符号进行时间复杂性分析;
三、实验任务
老板有一袋金块
(
共
n
块
)
,最优秀的雇员得到其中最重的一块,最差的雇员得到其中最轻的一块。
假设有一台比较重量的仪器,我们希望用最少的比较次数找出最重与最轻的金块。
思路
题目要求用分治法,直接递归二分就行
代码
#include <iostream>
#include <algorithm>
using namespace std;
void Rarr(int *arr, int len, int minn, int maxn) {
srand(time(0));
for (int i = 0; i < len; i++) {
arr[i] = minn + rand() % (maxn - minn + 1);
}
}
pair<int, int> findall(int* arr, int l, int r) {
if (r - l <= 1) {
return pair<int, int>(min(arr[r], arr[l]), max(arr[r], arr[l]));
}
else if (r - l > 1) {
return pair<int, int>(min(findall(arr, l, (l + r) / 2).first, findall(arr, (l + r) / 2, r).first), max(findall(arr, l, (l + r) / 2).second, findall(arr, (l + r) / 2, r).second));
}
}
int main() {
int n;
cin >> n;
int* arr = new int[n];
Rarr(arr, n, 1, 1000);
cout << "生成的随机数组:";
for (int i = 0; i < n; i++)
{
cout << arr[i] << ' ';
}cout << endl;
cout <<"最小值 "<< findall(arr, 0, n - 1).first << endl;
cout <<"最大值 "<< findall(arr, 0, n - 1).second << endl;
}