分治法求数组的最大值最小值

实现求数组的最大值最小值,蛮力法要容易的多。本着重在体验分治法的思想的原则:

 1 int main(void)
 2 {
 3     void Maxmin(int a[],int low,int high,int maxmin[2]);
 4     int a[10],maxmin[2];
 5
 6     printf("Enter 10 integer numbers:\n");
 7     for(int i=0;i<10;i++)
 8         scanf("%d",a+i);
 9
10     Maxmin(a,0,9,maxmin);
11     printf("\nMaximum: %d\nMinimum: %d\n",maxmin[0],maxmin[1]);
12     system("pause");
13     return 1;
14 }
15
16 // 分治法求数组的最大值和最小值
17 void Maxmin(int a[],int low,int high,int maxmin[2])
18 {
19     int mid;
20     int maxmin1[2],maxmin2[2];
21
22     if (high==low)
23     {
24         maxmin[0]=a[low];
25         maxmin[1]=a[low];
26         return;
27     }
28     if (high==low+1)
29     {
30         if(a[high]>a[low])
31         {
32             maxmin[0]=a[high];
33             maxmin[1]=a[low];
34         }else
35         {
36             maxmin[0]=a[low];
37             maxmin[1]=a[high];
38         }
39         return;
40     }
41     else
42     {
43         mid = (high+low)/2;
44         Maxmin(a,low,mid,maxmin1);
45         Maxmin(a,mid+1,high,maxmin2);
46         if(maxmin1[0]>maxmin2[0])
47             maxmin[0]=maxmin1[0];
48         else
49             maxmin[0]=maxmin2[0];
50         // minimum
51         if(maxmin1[1]<maxmin2[1])
52             maxmin[1]=maxmin1[1];
53         else
54             maxmin[1]=maxmin2[1];
55     }
56 }
时间: 2024-10-01 04:34:02

分治法求数组的最大值最小值的相关文章

《github一天一道算法题》:分治法求数组最大连续子序列和

看书.思考.写代码! /*************************************** * [email protected] * blog: http://blog.csdn.net/hustyangju * 题目:分治法求数组最大连续子序列和 * 思路:分解成子问题+合并答案 * 时间复杂度:O(n lgn) * 空间复杂度:O(1) ***************************************/ #include <iostream> using nam

求数组的最大值和最小值

求数组的最大最小值,可以遍历一遍数组,然后分别记录最大值和最小值,这种方法需要的比较次数为2N次.如果想要减少比较次数,可以采用的方法是遍历数组,然后比较相邻元素,把相邻元素的较大值放在后面,较小的放在前面.在从较大值中选取最大值即为整个数组的最大值,从较小值中选取最小值即为整个数组的最小值.这时,需要的比较次数为1.5*N次. void findmaxmin(int a[],int n) { if(a==NULL||n<0) return ; int i=0; int maxe=0x80000

分治法求众数问题 (配图)

分治法求众数问题 (配图) 采用分治法,以中间为界限, 先计算围绕中间这个数字的众数情况,然后左右分开递归计算结果,取最值即可. 左右递归计算的时候要先做判断,假如左边或是右边的个数都比已求的重数小,就没必要计算了,即使左边或是右边全部都是一样的,那么他的重数也是小于已求的,所以没必要进行运算,这一周在加深分治算法的学习,这题着实花了我不少时间. 具体代码: // 用分治法求众数 #include <iostream> #include <cstdio> using namespa

求数组的最大值和次大值

#include <stdio.h> #include <stdlib.h> /* 求数组的最大值和次大值. */ int main() { int n; while (printf("Please input n:\n"),fflush(stdin), scanf("%d", &n) != EOF){ if (n < 2){ printf("Please input a bigger number.\n")

求数组中的最小值以及最小值的序列号

var Arr = [5,6,1,2,3];// var minValue = Math.min.apply(null,Arr);//apply方法可直接求出数组中的最小值var minIndex = $.inArray(minValue,Arr);//inArray求最小数在数组中的序列号 固定方法 alert(minIndex);//输出2 即数字1在数组中的位置 求数组中的最小值以及最小值的序列号

第十六周oj刷题——Problem K: 填空题:类模板---求数组的最大值

Description 类模板---求数组的最大值 找出一个数组中的元素的最大值,数组大小为10.(用类模板来实现) 数组元素类型作为类模板的参数. Input 10个int型数据 10个double型数据 10个char型数据 10gestring型数据 Output 10个int型数据的最大值 10个double型数据的最大值 10个char型数据的最大值 10个string型数据的最大值 Sample Input 1 3 5 7 9 8 6 4 2 0 1.2 3.4 5.66 7.8 9

HDU ACM 1007 Quoit Design 分治法求最近点对

题意:给n个点的坐标,求距离最近的一对点之间距离的一半. 分析:分治法求最近点对. #include<iostream> #include<algorithm> #include<cmath> using namespace std; #define N 100005 double min(double a,double b) { return a<b?a:b; } struct POINT { double x,y; }; POINT point[N],*px[

js求数组的最大值--奇技淫巧和笨方法

写这篇文章的原因我目前做的项目很少用到算法,于是这方面的东西自然就有点儿生疏.最近的一次编码中遇到了从数组中获取最大值的需求,当时我不自觉的想到了js的sort()函数,现在想来真是有些“罪过”,当时自己内心还觉得有些得意:“嗯,我用js的内置方法解决了一个通常需要用排序算法才能解决的问题,代码简短,不用去写头疼的遍历和比较,可读性还好...”.内心戏很重,对吧.咳咳,哎,自己还是嫩而且还懒.js内生的sort函数也是用到了排序,详见segmentfault上的这个js内生sort()函数是如何

JS中 reduce() 数组去重及求数组项最大值

一.语法 arr.reduce(function(prev,cur,index,arr){...}, init); 其中, arr表示原数组;prev表示上一次调用回调时的返回值,或者初始值 init;cur表示当前正在处理的数组元素;index表示当前正在处理的数组元素的索引,若提供 init 值,则索引为0,否则索引为1;init表示初始值. 1.求数组项最大值 let arr = [1, 2, 3,3,2,4] let max = arr.reduce(function (prev, cu