从数组中查找出最大最小两数的log(n)算法
2009-12-02 15:17
381 查看
从一个数组中选择出最大和最小两个数的一般实现方法是从数组第一个元素到最后一个挨个比较,用两个数分别记录max、min,时间复杂性为O(n).其实还有效率更高的方法,下面将介绍的方法时间复杂性为O(log(n))
java实现:
#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; // 同理 } }
相关文章推荐
- 从数组中查找出最大最小两数的log(n)算法
- 算法实验一:二分查找算法改进: 当搜索元素x不存在时,返回小于x的最大元素位置i和大于x的最小元素位置j. 当搜索元素在数组中时,i和j相同,均为x在数组中的位置。
- 设计一个最优算法来查找n个元素数组中的最大值和最小值
- 设计一个最优算法来查找一n个元素数组中的最大值和最小值。已知一种需要比较2n次的方法,请给一个更优的算法。
- 算法8:一个整数数组里怎么同时找最大和最小的数,尽量优化比较次数
- 查找数组(不限维数)中的最大元素和最小元素
- 字符串算法——查找有序数组旋转后的最小值(无重复元素)(Find Minimum in Rotated Sorted Array)
- Java算法——一维数组的常见操作(遍历,求最大值,最小值,逆序,查找)
- 数据结构——算法之(041)(寻找数组中的最大值和最小值)
- 二叉查找树的查找,插入,最大/最小值查找,前驱/后续查找,删除算法[java]
- 数组基本算法(最大值,最小值,总和,平均数,复制,反转,排序)
- 每天一道算法题目,求数组中的最大值和最小值
- 从一个数组中同时找出最大最小数-算法导论第九章
- 一行代码实现数组中最大值与最小值的查找
- C++ 算法 查找旋转数组中的最小值 允许重复元素
- 初始化一个有10个整数的数组,在数组中查找并输出最大值和最小值。
- 数组 获取最值(最大值 最小值)选择排序 冒泡排序 快速排序 半查找(二分查找) 十进制转其他进制法
- 数据结构——算法之(041)(寻找数组中的最大值和最小值)
- 给定数组,查找最小的k个元素或最大的k个元素
- 【算法导论】同时求数组的最大值和最小值