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

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

    原文作者:查找算法
    原文地址: https://blog.csdn.net/cangyingzhijia/article/details/4924651
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞