分治法求最大最小元素
2012-05-06 23:11
232 查看
问题:在含n个元素的集合中寻找最大值和最小值。
最常见的做法是:
算法中需要比较N-1次,才能得到max,最好的情况是升序,不需要进行与min的比较, 共进行n-1次比较。
最坏的情况是降序,要经过n-1次比较得到Min,共进行2*n-2次比较,至于在平均情况下,为3(n-1)/2;
用分治法可以用较少的次数解决上述问题。
1,将数据等分为2组,目的是分别选取其中的最大值和最小值
2,递归分解直到每组元素的个数<=2;可简单的找到最大最小值
3.回溯时合并子问题的解,在两个子问题的解中大者取大,小者取小,既合并为当前问题的解。
最常见的做法是:
max=a[1]; min=a[1]; for(i=2;i<=n;i++) if(max<a[i]) max=a[i]; else if(min>a[i]) min=a[i];
算法中需要比较N-1次,才能得到max,最好的情况是升序,不需要进行与min的比较, 共进行n-1次比较。
最坏的情况是降序,要经过n-1次比较得到Min,共进行2*n-2次比较,至于在平均情况下,为3(n-1)/2;
用分治法可以用较少的次数解决上述问题。
1,将数据等分为2组,目的是分别选取其中的最大值和最小值
2,递归分解直到每组元素的个数<=2;可简单的找到最大最小值
3.回溯时合并子问题的解,在两个子问题的解中大者取大,小者取小,既合并为当前问题的解。
#include<iostream> #include<minmax.h> using namespace std; void maxmin(int a[],int &e_max,int &e_min,int low,int high) { int mid,x1,y1,x2,y2; if((high-low)<=1) //若相等,high=low,最大最小都是这个数,可以把这个写出2个 { if(a[high]>a[low]) { e_max=a[high]; e_min=a[low]; } else { e_max=a[low]; e_min=a[high]; } } else { mid=(low+high)/2; maxmin(a,x1,y1,low,mid); maxmin(a,x2,y2,mid+1,high); e_max=max(x1,x2); e_min=min(y1,y2); } } int main() { int a[]={8,3,6,2,1,9,4,5,7};//9个元素 int low=0; int high=8; int e_max,e_min; maxmin(a,e_max,e_min,low,high); cout<<e_max<<ends<<e_min<<endl; }
相关文章推荐
- 分治法求数组中的最大最小元素
- 分治法——查找最大最小元素(Python)
- 算法笔记04--分治法之寻找最大最小元素
- 分治法——查找最大最小元素(C++)
- 分治法-求最大最小元素
- 将一个5*5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(对比两个程序)
- 随机产生20个[10 , 50]的正整数存到数组中,并求数组中的所有元素最大值、最小值、平均值以及各元素之和,及第二大值。
- 无序数组同时查找最大和最小的元素
- 函数调用输出一个一维数组中的最大值、最小值、全部元素的和,并将此数组中的值按逆序重新存放。
- 编写一组求数组中最大最小元素的函数
- 找出一个二维数组中的“鞍点”,即该位置上的元素在该行中 最大,在该列中最小(也可能没有“鞍点”),打印有关信息。(提示:注意特 殊情况:没鞍点或多个鞍点)
- 输入一个一维数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
- 给定一个递增序列,a1 <a2 <...<an 。定义这个序列的最大间隔为d=max{ai+1 - ai }(1≤i<n),现在要从a2 ,a3 ..an-1 中删除一个元素。问剩余序列的最大间隔最小是多少?
- 8.10 将一个5X5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(顺序为从左到右,从上到下依次从小到大存放),写一函数实现之。用main函数调用。
- O(1)时间复杂度实现入栈、出栈、获得栈中最小元素、获得栈中最大元素
- 将一个5*5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(顺序为从左到右,从上到下顺序依次从小到大存放),写一函数实现之。
- heapq取列表最大或最小值元素
- Python中查找最大或最小的N个元素
- 用分治法,二分求出数组的最大值和最小值
- C语言:将一个5x5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素....