从一个数组中选择出最大和最小两个数的一般实现方法是从数组第一个元素到最后一个挨个比较,用两个数分别记录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; // 同理
- }
- }