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


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

 

[cpp]  view plain copy
  1. #include <stdio.h>  
  2. void maxmin(int a[],int i, int j, int *max, int *min){  
  3.     int m,_max1,_min1,_max2,_min2;  
  4.     if(i == j)  
  5.     {  
  6.        *max = a[i];  
  7.        *min = a[j];  
  8.     }  
  9.     else  
  10.     {  
  11.        m = (i + j) >>1;  
  12.        maxmin(a, i, m, &_max1, &_min1);  
  13.        maxmin(a, m+1, j, &_max2, &_min2);  
  14.        *max = _max1 > _max2 ? _max1 : _max2;  
  15.        *min = _min1 > _min2 ? _min2 : _min1;  
  16.     }  
  17. }  
  18. int main(){  
  19.     int a[] = {1,4,7,8,5,2,3,6,9};  
  20.     int max,min;  
  21.     maxmin(a,0,8,&max,&min);  
  22.     printf("max=%d,min=%d",max,min);  
  23.     getch();  
  24.     return 0;  
  25. }  

 

java实现:

[java]  view plain copy
  1. public class MaxMin {  
  2.     public static void main(String args[]){  
  3.         int a[] = {5,6,9,8,7,4,1,2,3};  
  4.         Value v = maxmin(a,0,a.length -1);  
  5.         System.out.printf("max=%d,min=%d/n",a[v.max],a[v.min]);  
  6.     }  
  7.       
  8.     //从数组a[i...j]中选择出最大和最小两个值来  
  9.     static Value maxmin(int a[],int i,int j){  
  10.         Value value = new Value();  
  11.         if(i == j){  
  12.             value.max = i;  
  13.             value.min = j;  
  14.         }else{  
  15.             int m = (i + j)>>1;  
  16.             Value v1 = maxmin(a,i,m);  
  17.             Value v2 = maxmin(a,m+1,j);           
  18.             value.max = a[v1.max] > a[v2.max] ? v1.max :v2.max;  
  19.             value.min = a[v1.min] > a[v2.min] ? v2.min :v1.min;                        
  20.         }         
  21.         return value;  
  22.     }  
  23.       
  24.     static class Value{  
  25.         int max; //最大值所在数组的位置  
  26.         int min; // 同理  
  27.     }  
  28.       
  29. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值