算法选最大最小问题
Posted jkl233
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法选最大最小问题相关的知识,希望对你有一定的参考价值。
@[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<<‘ ‘<<"最小数:"<<min_n<<endl; system("pause"); return 0; }
## 复杂度
W(n) = 2W(n/2) + 2;
W(2) = 1;
W(n) = 3n/2 - 2;
以上是关于算法选最大最小问题的主要内容,如果未能解决你的问题,请参考以下文章