从数组中查找出最大最小两数的log(n)算法
2013-07-05 13:46
302 查看
从一个数组中选择出最大和最小两个数的一般实现方法是从数组第一个元素到最后一个挨个比较,用两个数分别记录max、min,时间复杂性为O(n).其实还有效率更高的方法,下面将介绍的方法时间复杂性为O(log(n))
[cpp] view
plaincopy
#include <stdio.h>
void maxmin(int a[],int i, int j, int *max, int *min){
int m,_max1,_min1,_max2,_min2;
if(i == j)
{
*max = a[i];
*min = a[j];
}
else
{
m = (i + j) >>1;
maxmin(a, i, m, &_max1, &_min1);
maxmin(a, m+1, j, &_max2, &_min2);
*max = _max1 > _max2 ? _max1 : _max2;
*min = _min1 > _min2 ? _min2 : _min1;
}
}
int main(){
int a[] = {1,4,7,8,5,2,3,6,9};
int max,min;
maxmin(a,0,8,&max,&min);
printf("max=%d,min=%d",max,min);
getch();
return 0;
}
java实现:
[java] view
plaincopy
public class MaxMin {
public static void main(String args[]){
int a[] = {5,6,9,8,7,4,1,2,3};
Value v = maxmin(a,0,a.length -1);
System.out.printf("max=%d,min=%d/n",a[v.max],a[v.min]);
}
//从数组a[i...j]中选择出最大和最小两个值来
static Value maxmin(int a[],int i,int j){
Value value = new Value();
if(i == j){
value.max = i;
value.min = j;
}else{
int m = (i + j)>>1;
Value v1 = maxmin(a,i,m);
Value v2 = maxmin(a,m+1,j);
value.max = a[v1.max] > a[v2.max] ? v1.max :v2.max;
value.min = a[v1.min] > a[v2.min] ? v2.min :v1.min;
}
return value;
}
static class Value{
int max; //最大值所在数组的位置
int min; // 同理
}
}
[cpp] view
plaincopy
#include <stdio.h>
void maxmin(int a[],int i, int j, int *max, int *min){
int m,_max1,_min1,_max2,_min2;
if(i == j)
{
*max = a[i];
*min = a[j];
}
else
{
m = (i + j) >>1;
maxmin(a, i, m, &_max1, &_min1);
maxmin(a, m+1, j, &_max2, &_min2);
*max = _max1 > _max2 ? _max1 : _max2;
*min = _min1 > _min2 ? _min2 : _min1;
}
}
int main(){
int a[] = {1,4,7,8,5,2,3,6,9};
int max,min;
maxmin(a,0,8,&max,&min);
printf("max=%d,min=%d",max,min);
getch();
return 0;
}
java实现:
[java] view
plaincopy
public class MaxMin {
public static void main(String args[]){
int a[] = {5,6,9,8,7,4,1,2,3};
Value v = maxmin(a,0,a.length -1);
System.out.printf("max=%d,min=%d/n",a[v.max],a[v.min]);
}
//从数组a[i...j]中选择出最大和最小两个值来
static Value maxmin(int a[],int i,int j){
Value value = new Value();
if(i == j){
value.max = i;
value.min = j;
}else{
int m = (i + j)>>1;
Value v1 = maxmin(a,i,m);
Value v2 = maxmin(a,m+1,j);
value.max = a[v1.max] > a[v2.max] ? v1.max :v2.max;
value.min = a[v1.min] > a[v2.min] ? v2.min :v1.min;
}
return value;
}
static class Value{
int max; //最大值所在数组的位置
int min; // 同理
}
}
相关文章推荐
- 从数组中查找出最大最小两数的log(n)算法
- 设计一个最优算法来查找n个元素数组中的最大值和最小值
- 算法实验一:二分查找算法改进: 当搜索元素x不存在时,返回小于x的最大元素位置i和大于x的最小元素位置j. 当搜索元素在数组中时,i和j相同,均为x在数组中的位置。
- 设计一个最优算法来查找一n个元素数组中的最大值和最小值。已知一种需要比较2n次的方法,请给一个更优的算法。
- 字符串算法——查找数组第K个最大值( Kth Largest Element in an Array)
- 二叉查找树的查找,插入,最大/最小值查找,前驱/后续查找,删除算法[java]
- 数据结构与算法读书笔记4----C# 查找数组中指定数字,最小值,最大值。
- 设计一个更优算法查找一n个元素数组中的最大值和最小值
- C++查找数组中的最大值和最小值
- 较快速在一个数组中查找最大值和最小值(2)
- 初始化一个有10个整数的数组,在数组中查找并输出最大值和最小值。
- SQL Server 2008 R2――查找最小nIndex,nIndex存在而nIndex+1不存在 求最小连续数组中的最大值
- C++ 算法 查找旋转数组中的最小值 允许重复元素
- 算法学习-查找旋转数组的最小值
- 数据结构——算法之(041)(寻找数组中的最大值和最小值)
- 算法8:一个整数数组里怎么同时找最大和最小的数,尽量优化比较次数
- 给定数组,查找最小的k个元素或最大的k个元素
- C语言实现数组中查找最大值、最小值和第二大值
- 数组基本算法(最大值,最小值,总和,平均数,复制,反转,排序)
- PHP查找数值数组中不重复最大和最小的10个数的方法