码迷,mamicode.com
首页 > 编程语言 > 详细

算法选最大最小问题

时间:2018-11-11 13:48:28      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:数组   ax1   情况   nbsp   div   最坏情况   个数   back   main   

@[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;




算法选最大最小问题

标签:数组   ax1   情况   nbsp   div   最坏情况   个数   back   main   

原文地址:https://www.cnblogs.com/jkl233/p/9941855.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!