算法选最大最小问题

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;





































以上是关于算法选最大最小问题的主要内容,如果未能解决你的问题,请参考以下文章

二分图匈牙利算法模板

模板匈牙利算法

从搜索文档中查找最小片段的算法?

分治策略 - 典型实例 - 选择问题

最小费用最大流算法

使用Java中的数组更好的最小和最大算法