您的位置:首页 > 其它

从数组中查找出最大最小两数的log(n)算法

2009-12-02 15:17 381 查看
从一个数组中选择出最大和最小两个数的一般实现方法是从数组第一个元素到最后一个挨个比较,用两个数分别记录max、min,时间复杂性为O(n).其实还有效率更高的方法,下面将介绍的方法时间复杂性为O(log(n))

#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实现:

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; // 同理
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐