算法学习十五----找数组最大值和最小值
来源:互联网 发布:淘宝开个人食品店 编辑:程序博客网 时间:2024/05/20 07:32
题目:给定一个数组,找出数组中的最大值和最小值
算法思路一:使用两个“游标”,p代表最大值,q代表最小值,初始为数组的第一个和第二个,不断向后移并且做比较,每次移动时将较大值与p比较,将p赋为较大值,较小值也同理。这样就能找到最大值和最小值。此算法要注意的地方就是当数组只有一个元素以及数组的个数为奇数个时要做另外的处理
算法伪代码如下:
if array.size = 1then max = min = array[0]max = Max(arr[0], arr[1]), min = Min(arr[0], arr[1])for i <- 0 to size j <- i+1 to sizeif max < Max(arr[i], arr[j])then max = maxoneif min > Min(arr[i], arr[j])then min = minoneif size is not eventhen compare max and min with last elementgot max and min
//solution 1template <class T>void FindMaxMin(T *arr, int size){ T max = 0, min = 0; //if array.size = 1 if(size == 1) { //max = min = array[0] cout << "max : " << arr[0] << " min : " << arr[0] << endl; return; } //max = Max(arr[0], arr[1]), min = Min(arr[0], arr[1]) max = Max(arr[0], arr[1]); min = Min(arr[0], arr[1]); //for i <- 0 to size j <- i+1 to size for(int i = 0, j = i+1; i != size && j != size; ++i, ++j) { //if max < Max(arr[i], arr[j]) if(max < Max(arr[i], arr[j])) { //then max = maxone max = Max(arr[i], arr[j]); } //if min > Min(arr[i], arr[j]) if(min > Min(arr[i], arr[j])) { //then min = minone min = Min(arr[i], arr[j]); } } //if size is not even if(size%2 != 0) { //then compare max and min with last element if(max < arr[size-1]) { max = arr[size-1]; } if(min > arr[size-1]) { min = arr[size-1]; } } //got max and min cout << "max : " << max << " min : " << min << endl;}
算法思路二:
采用分治的方法,先计算得到前后N/2个数的最大和最小值,再将N/2个数划分为两个数组分别求两个数组的最大值和最小值,以此类推,最后可以得到整个数组的最大值和最小值。
算法伪代码如下:
if remain 2 element or one elementthen max = maxone, min = minoneFindMaxMin in 2 size/2 counts'array recursionlymax = maxone, min = minone
C++实现:
template <class T>NumberPair<T> FindMaxMin(T * arr, int begin, int end){ //if remain 2 element or one element if(end - begin <= 1) { //then max = maxone, min = minone NumberPair<T> n; if(arr[begin] < arr[end]) { n.max = arr[end]; n.min = arr[begin]; return n; } else { n.max = arr[begin]; n.min = arr[end]; return n; } } //FindMaxMin in 2 size/2 counts'array recursionly NumberPair<T> L = FindMaxMin(arr, begin, begin + (end-begin) / 2); NumberPair<T> R = FindMaxMin(arr, begin + (end-begin) / 2 + 1, end); //max = maxone, min = minone NumberPair<T> result; result.max = Max(L.max, R.max); result.min = Min(L.min, R.min); return result;}
0 0
- 算法学习十五----找数组最大值和最小值
- 找最大值和最小值
- 算法学习日记--寻找数组中的最大值和最小值
- 分而治之算法——找最大值最小值
- 寻找数组中最大值和最小值—分治算法
- 【算法导论】同时求数组的最大值和最小值
- ios数组最大值,最小值,平均值,和的快速算法
- ios 数组最大值,最小值,平均值,和的快速算法
- 同时求数组的最大值和最小值的分治算法
- 每天一道算法题目,求数组中的最大值和最小值
- 数组元素最大值和最小值
- 数组获取最大值和最小值
- Code58 从ArrayList找最大值和最小值
- 数列特征(找最大值、最小值、和)
- 【算法导论】最大值和最小值
- STL算法------最小值和最大值
- 找最大值与最小值
- vector找最大值 最小值
- Android开发必备的21个免费资源和工具
- C++中内存存储
- 完全数
- 二叉查找树的操作
- Hibernate问题记录
- 算法学习十五----找数组最大值和最小值
- 想出好创意 做出好产品 成为好的创业者
- Go语言 unsafe的妙用
- MySQL分库分表环境下全局ID生成方案
- 71道Android开发面试题
- hdu 2817 A sequence of numbers(判断是等差还是等比数列)
- POJ 3080 多个串最长公共子序列
- css空白边叠加的介绍
- 企业即时通讯系统十大排名