@[TOC](算法选最大最小问题)
# 蛮力算法
顺序比较,选出最大的max;顺序比较,在剩余的数组中选出最小的min;
时间复杂度为(最坏情况下):W(n) = n - 1 + n - 2 = 2n - 3;
# 分治法
## 思路
1、将数组L从中间划分为两个子数组L1和L2
2、递归的在L1中求最大max1和min1
3、递归的在L2中求最大max2和min2
4、max←max{max1,max2}
5、 min←min{min1,min2}
## 伪代码
输入:n个数的数组L
输出:max,min
1.将n个元素两两一组分成 ?n/2? 组
2.每组比较,得到?n/2? 个较小和?n/2? 个较大
3.在 ?n/2? 个较大(含轮空元素)中找最小max
4.在?n/2? 个较小(含轮空元素)中找最小min
## C++代码
//假设只对只有十个元素的数组,进行选最大的和最小的,代码如下:
#include <iostream>
#include <vector>
using namespace std;
void max_min(vector<int> v,int i,int j,int &max_n, int &min_n)
{
//子问题规模较小,解决子问题
if (i == j)
{
max_n = v[i];
min_n = v[i];
return ;
}
else if ( i+1 == j)
{
if (v[i]<v[j])
{
max_n = v[j];
min_n = v[i];
}
else
{
min_n = v[j];
max_n = v[i];
}
return ;
}
//分解原问题为更小的子问题
int max1_n,min1_n,max2_n,min2_n;
max_min(v,i,(i+j)/2,max1_n,min1_n);
max_min(v,(i+j)/2+1,j,max2_n,min2_n);
//合并子问题
max_n = max1_n>max2_n?max1_n:max2_n;
min_n = min1_n<min2_n?min1_n:min2_n;
return;
}
int main()
{
vector<int> v;
v.push_back(3);
v.push_back(6);
v.push_back(1);
v.push_back(8);
v.push_back(2);
v.push_back(9);
v.push_back(0);
v.push_back(5);
v.push_back(7);
v.push_back(4);
for (int i=0;i<10;++i)
{
cout<<v[i]<<‘ ‘;
}
cout<<endl;
int max_n,min_n;
max_min(v,0,9,max_n,min_n);
cout<<"最大数:"<<max_n<<‘\t‘<<"最小数:"<<min_n<<endl;
system("pause");
return 0;
}
## 复杂度
W(n) = 2W(n/2) + 2;
W(2) = 1;
W(n) = 3n/2 - 2;
原文:https://www.cnblogs.com/jkl233/p/9941855.html