求最大值和最小值的分治算法

合集下载

正方形中最值问题10种求法

正方形中最值问题10种求法

正方形中最值问题10种求法
问题描述:
在一个正方形中,有n个正整数,求其中的最大值max和最小值min。

解决方法:
1.暴力枚举:遍历整个正方形中的所有元素,找到其中的最大值和最小值。

2.排序:先将正方形中的所有元素进行排序,然后取第一个和最后一个即可得到最小值和最大值。

3.分治算法:将正方形分成四个子正方形,递归求解每个子正方形的最大值和最小值,然后取出所有子正方形中的最小值和最大值。

4.扫描算法:扫描正方形的每一列和每一行,分别求出每一列和每一行中的最大值和最小值,然后取出所有值中的最小值和最大值。

5.分块算法:将正方形分成若干块,对每一块单独求解最大值和最小值,然后取出所有块的最小值和最大值。

6.二分查找:对正方形中的所有元素进行二分查找,找到其中的最大和最小值。

7.动态规划:使用动态规划算法,计算正方形中的最大值和最小值。

8.贪心算法:使用贪心算法,从正方形的左下角开始依次遍历所有元素,每次选择当前可选元素中的最大值和最小值。

9.最大最小树算法:使用最大最小树算法,计算正方形中的最大值和最小值。

10.线段树算法:使用线段树算法,计算正方形中的最大值和最小值。

总结:
不同的求解方法适用于不同的情况。

在实际应用中,需要根据具体问题选择合适的算法来求解。

一般情况下,暴力枚举法效率最低,而分治算法、扫描算法、分块算法、二分查找、动态规划、贪心算法、最大最小树算法、线段树算法效率较高,但也需要考虑算法的实现难度和空间复杂度等因素。

maxmin(分治法)

maxmin(分治法)

用分治法(二分法)可以用较少的比较次数解决上述问题。

问题可简化为如下三个步骤:(1)将数据等分为两组(两组数据可能差1),目的是分别选取其中的最大和最小值。

(2)递归分解直到每组元素的个数≤2,可简单地找到最大和最小值。

(3)回溯时合并子问题的解,在两个子问题的解中大者取大,小者取小,即合并为当前问题的解。

递归求取数组a中最大和最小元素的算法如下:maxmin(i, j , fmax, fmin)float A[n];maxmin(i, j, fmax, fmin)//最大和最小元素赋给fmax和fmin{ if (i==j){ fmax = A[i];fmin =A[i];}// 每组元素的个数=1时else if (i==j-1)if (A[i]<A[j]){ fmax ← A[j];fmin ← A[i]}// 每组元素的个数=2时else{ fmax ← A[i]; fmin ← A[j]; }else{ mid ← (i+j)/2;maxmin(i,mid,lmax,lmin)maxmin(mid+1,j,rmax,rmin)if (lmax > rmax)fmax = lmax;elsefmax = rmax;if (lmin > rmin)fmin = rmin;elsefmin = lmin;}}例2.3.3.2在下述9个元素上模拟递归求最大和最小元素的过程。

数组A[1..9]的各个元素如下:如果用T (n )表示maxmin 中元素比较次数,则所导出的递归关系式是: 0 n=1=)n (T 1 n=22)2n (T )2n (T +⎥⎥⎤⎢⎢⎡+⎥⎦⎥⎢⎣⎢ n>2 在最坏情况下,递归求最大最小元素比第一种算法要好一些,平均情况下两者差不多。

当n 是2的幂时,即对于某个正整数k ,k 2n =,可以证明,任何以元素比较为基础的找最大和最小元素的算法,其元素比较下界均为22n 3-⎥⎥⎤⎢⎢⎡次。

分治法求最大值最小值

分治法求最大值最小值

分治法求最大值最小值a.为一个分治算法编写伪代码,该算法同时求出一个n元数组的最大元素和最小元素的值。

b.假设n=2k,为该算法的键值比较次数建立递推关系式并求解。

c.请拿该算法与解同样问题的蛮力算法做一个比较。

解答:a.同时求出原数组最大值和最小值,先将原数组一分为二,再找出划分的两个部分的最值,然后再合并最值,找划分的两个部分的最值就递归地在这两个部分中用同样的方法找最大值和最小值,然后只需要给出最小规模的确切解法作为递归出口就可以了。

算法MaxMin(A[f…l],Max,Min)//该算法利用分治法求得数组A中的最大值和最小值//输入:数值数组A[f..l]//输出:最大值Max和最小值Minif l−f=0 //只有一个元素时Max←A[f];Min←A[f];elseif l-f=1 //有两个元素时if A[f]>A[l] //基本操作是作比较Max←A[f] ,Min←A[l]else Max←A[l] ,Min←A[f]else //有大于两个元素时MaxMin(A[f…(f+l2)],Max1,Min1);//递归解决前一部分MaxMin(A[(f+l2)…l],Max2,Min2); //递归解决后一部分Max←max {Max1,Max2};//从两部分的两个最大值中选择大值Min←min {Min1,Min2};//从两部分的两个最小值中选择小值 return Max,Min;b.假设n=2k,比较次数的递推关系式:C(n)=2C(n2)+2 ,n>2C(1)=0, C(2)=1C(n)=C(2k)=2C(2k-1)+2=2[2C(2k-2)+2]+2=22C(2k-2)+22+2=23C(2k-3)+23+22+2...=2k-1C(2)+2k-1+2k-2+...+2 //C(2)=2 =2k-1+2k-1+2k-2+...+2 //等比数列求和=2k-1+2k-2 //2k=n, 2k-1=n2=3n−22b.蛮力法的算法如下:算法ForceMaxMin(A[l..r])//用蛮力法得到数组A的最大值和最小值//输入:数值数组A[l…r]//输出:最大值Max和最小值MinMax=Min=A[l];for i=l+1 to r doif A[i]>Max Max←A[i];else if A[i]<MinMin←A[i]return Max,Minc.作比较ForceMaxMin的时间复杂度T(n)=2n−2算法MaxMin的时间复杂度为3n−2,ForceMaxMin的时间复杂度为2n-2,都属于Θ(n),2但MaxMin的速度要比ForceMaxMin的稍快一点。

分治法寻找数组最大的两个数和最小的两个数

分治法寻找数组最大的两个数和最小的两个数

分治法寻找数组最⼤的两个数和最⼩的两个数分治法寻找数组最⼤的两个数和最⼩的两个数这个程序实现的结果:假如有两个并列最⼤或并列最⼩数,他们两个是有可能⼀起作为最⼤和次⼤(最⼩和次⼩)。

所以,应该尽量保证没有相同⼤⼩的数据。

但程序对相同的数据不是返回同⼀个下标的数,⽽是不同下标的数据本程序旨在练习分治法,其他的请参看最⼤和最⼩值的求法。

1 #include<stdio.h>2 #include<time.h>3 #include<stdlib.h>4int maxMin2(int *a,int i,int j,int *max1,int *max2,int *min1,int *min2);5int max(int a,int b);6int min(int a,int b);7int main()8 {9int *a;10int i,n;11int max1,max2,min1,min2;1213 scanf("%d",&n);14 a=(int *)malloc(sizeof(int)*n);15 srand((unsigned int)time(0));16for(i=0;i<n;i++) a[i]=rand()%91+10;17for(i=0;i<n;i++)18 {19 printf("%d ",a[i]);20if((i+1)%5==0) printf("\n");21 }22 printf("\n\n");23 maxMin2(a,0,n-1,&max1,&max2,&min1,&min2);24 printf("%d %d\n%d %d\n",max1,max2,min1,min2);/**/25return0;26 }27int maxMin2(int *a,int i,int j,int *max1,int *max2,int *min1,int *min2)28 {29int mid,t;30int lmax1,lmax2,lmin1,lmin2,rmax1,rmax2,rmin1,rmin2;31if(j-i==2)32 {33 *max1=max(a[j],max(a[i],a[i+1]));34 *min1=min(a[j],min(a[i],a[i+1]));35 t=a[i]+a[j]+a[i+1];36 *max2=t-*max1-*min1;37 *min2=*max2;38return0;39 }40else if(j-i==1)41 {42if(a[i]>a[j]){*max1=a[i];*max2=a[j]; *min1=a[j];*min2=a[i];return0;}43else{*max1=a[j];*max2=a[i]; *min1=a[i];*min2=a[j];return0;}44 }45else46 {47 mid=i+(j-i)/2;48 maxMin2(a,i,mid,&lmax1,&lmax2,&lmin1,&lmin2);49 maxMin2(a,mid+1,j,&rmax1,&rmax2,&rmin1,&rmin2);50if(lmax1>rmax1)51 {52 *max1=lmax1;53if(lmax2>rmax1) *max2=lmax2;54else *max2=rmax1;55 }56else57 {58 *max1=rmax1;59if(lmax1>rmax2) *max2=lmax1;60else *max2=rmax2;61 }62if(lmin1<rmin1)63 {64 *min1=lmin1;65if(lmin2<rmin1) *min2=lmin2;66else *min2=rmin1;67 }68else69 {70 *min1=rmin1;71if(lmin1<rmin2) *min2=lmin1;72else *min2=rmin2;73 }74 }75return0;76 }77int max(int a,int b)78 { return a>b?a:b; } 79int min(int a,int b)80 { return a<b?a:b; } View Code。

分治算法(实现求最大最小值和快速排序)

分治算法(实现求最大最小值和快速排序)

分治算法(实现求最大最小值和快速排序)实验一分治算法一、实验目的1)掌握分治算法的设计思想与分析方法,2)能够按题目要求编程实现分治算法。

二、方法原理将一个规模为n的原问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同;递归地求解这些子问题,然后将子问题的解合并为原问题的解。

三、实验设备PC机一台,C语言、PASCAL语言、Matlab任选四、掌握要点将原问题分解为若干规模较小、互相独立、与原问题形式相同的子问题;求解子问题;将子问题的解合并为原问题的解。

五、实验内容1)采用分治算法求10个实数{ 9,3,6,2,1,8,4,5,7,23 }序列中的最大元素和最小元素,并分析算法的时间复杂度。

2)编程实现:采用分治算法方法实现快速排序算法。

要求:输入数组为{9,4,6,2,5,8,4,5,6,22 };限定数组排序范围;输出显示为递增顺序排序的数组。

六、实验要求1)认真分析题目的条件和要求,复习相关的理论知识,选择适当的解决方案和算法;2)编写上机实验程序,作好上机前的准备工作;3)上机调试程序,并试算各种方案,记录计算的结果(包括必要的中间结果);4)分析和解释计算结果;5)按照要求书写实验报告;源代码:1.分治算法求10个实数{ 9,3,6,2,1,8,4,5,7,23 }序列中的最大元素和最小元素#include#includeint* getmaxmin(int a, int b) {int* t = new int[2];//动态if (a < b) {t[0] = a;t[1] = b;}else {t[0] = b;t[1] = a;}return t;}int * maxmin(int a[], int low, int high) {if (high - low <= 1) {int* t = new int[2];return getmaxmin(a[low], a[high]);}else {int mid = (high + low) / 2;int* m1 = maxmin(a, low, mid);int* m2 = maxmin(a, mid + 1, high);printf("前半部分得到的值:%d, %d\n", m1[0], m1[1]);printf("后半部分得到的值:%d, %d\n", m2[0], m2[1]);int*r= new int[2];if (m1[0] < m2[0]) {r[0] = m1[0];}else {r[0] = m2[0];}if (m1[1] < m2[1]) {r[1] = m2[1];}else {r[1] = m1[1];}return r;}}int main() {int a[10] = { 8,3, 6, 2, 1, 8, 4, 5, 7,23 };int* r = maxmin(a, 0, 9);printf("最大值为:%d,最小值为:%d\n", r[1], r[0]); system("pause");}结果:2.采用分治算法方法实现快速排序算法#include#includevoid swap(int &x, int &y) {int t;t = x;x = y;y = t;}int divide_and_conquer(int a[], int low, int high) {//按枢点元素划分序列int split int k, i = low;int x = a[low];for (k = low + 1; k <= high; k++) {if (a[k] <= x) {i += 1;if (i != k)swap(a[i], a[k]);}}swap(a[low], a[i]);return i;}void quick_sort(int a[], int low, int high) {int k;if (low < high) {k = divide_and_conquer(a, low, high);quick_sort(a, low, k - 1);quick_sort(a, k + 1, high);}}void main() {int a[] = { 9,4,6,2,5,8,4,5,6,22 }; quick_sort(a, 0, 9);for (int i = 0; i < 10; i++) printf("%d ", a[i]);system("pause");}结果:。

最大值最小值的求法

最大值最小值的求法

最大值最小值的求法在数学中,求解一个数据集中的最大值和最小值是一项基本的操作。

通过找到数据集中的最大值和最小值,我们可以更好地了解数据的范围和分布情况。

在本文中,我们将介绍几种常见的方法来求解最大值和最小值,以帮助读者更好地理解这一概念。

一、遍历法最简单直接的方法是通过遍历整个数据集来找到最大值和最小值。

具体步骤如下:1. 初始化最大值和最小值为数据集中的第一个元素;2. 从第二个元素开始,依次与当前的最大值和最小值进行比较;3. 如果找到比当前最大值还大的元素,则更新最大值;4. 如果找到比当前最小值还小的元素,则更新最小值;5. 继续遍历完整个数据集,直到找到最大值和最小值。

这种方法简单直接,但是需要遍历整个数据集,时间复杂度为O(n),其中n为数据集的大小。

二、排序法另一种常见的方法是先对数据集进行排序,然后直接取第一个元素作为最小值,取最后一个元素作为最大值。

具体步骤如下:1. 对数据集进行排序,可以使用快速排序、归并排序等方法;2. 排序完成后,第一个元素即为最小值,最后一个元素即为最大值。

这种方法的时间复杂度取决于排序算法的复杂度,通常为O(nlogn),其中n为数据集的大小。

三、分治法分治法是一种高效的方法,通过将数据集分成若干个子集,然后递归地求解子集的最大值和最小值,最终得到整个数据集的最大值和最小值。

具体步骤如下:1. 将数据集分成两个子集;2. 分别求解两个子集的最大值和最小值;3. 将子集的最大值和最小值与整个数据集的最大值和最小值进行比较,更新最大值和最小值;4. 递归地继续分割子集,直到子集的大小为1,即找到最大值和最小值。

这种方法的时间复杂度为O(n),效率较高。

四、优化方法除了上述方法外,还有一些优化方法可以进一步提高求解最大值和最小值的效率,例如使用分支限界法、动态规划等算法。

这些方法在特定情况下可以更快地找到最大值和最小值,但需要根据具体情况选择合适的算法。

综上所述,求解一个数据集中的最大值和最小值是一项基本的数学操作,可以通过遍历法、排序法、分治法等多种方法来实现。

分治算法实验(用分治法查找数组元素的最大值和最小值)

分治算法实验(用分治法查找数组元素的最大值和最小值)

算法分析与设计实验报告第一次实验附录:完整代码(分治法)#include<iostream>#include<time.h>#include<iomanip>using namespace std;//当数组中的元素个数小于3时,处理最大值int compmax(int A[],int start,int end){int max;if(start<end) //有两个元素{if(A[start]<=A[end])max=A[end];elsemax=A[start];}else//有一个元素max=A[start];return max;}//当数组中元素的个数小于2时,处理最小值int compmin(int A[],int start,int end){int min;if(start<end) //有两个元素{if(A[start]<=A[end])min=A[start];elsemin=A[end];}else//有一个元素min=A[start];return min;}//分治法处理整个数组,求最大值与最小值void merge(int a[],int left,int right,int &Max,int &Min) //Max,Min用来保存最大值与最小值//之所以使用&引用,是由于如果只是简单的使用变量,并不会改变Max与Min的值,使用指针也可以{int max1=0,min1=0,max2=0,min2=0;if(right-left>2) //当数组中元素个数大于等于3时,进行分治{int mid=(right+left)/2;merge(a,left,mid,max1,min1); //左半边递归调用自身,求出最大值最小值,分别保存在max1,min1中merge(a,mid+1,right,max2,min2); //右半边递归调用自身,求出最大值最小值,分别保存在max2,min2中if(max1>=max2) //子序列两两合并,求出最大值与最小值,保存在Max与Min中Max=max1;elseMax=max2;if(min1<=min2)Min=min1;elseMin=min2;}else//数组中元素个数小于3时的情况,直接赋值{Max=compmax(a,left,right);Min=compmin(a,left,right);}}void ran(int *input,int n) //随机生成数组元素函数{int i;srand(time(0));for(i=0;i<n;i++)input[i]=rand();input[i]='\0';}int a[1000000]; //定义全局变量用来存放要查找的数组int main(){int n;int i;int max;int min;cout<<"请输入要查找的序列个数:"<<endl;for(i=0;i<5;i++){cin>>n;ran(a,n);clock_t start,end,over; //计算程序运行时间的算法start=clock();end=clock();over=end-start;start=clock();merge(a,0,n-1,max,min); //调用分治法算法cout<<max<<" "<<min<<endl;end=clock();printf("The time is %6.3f",(double)(end-start-over)/CLK_TCK); //显示运行时间}system("pause"); //停止运行窗口return 0;}完整代码(非递归方法)#include<iostream>#include<time.h>#include<iomanip>using namespace std;void ran(int *input,int n) //随机生成数组元素函数{int i;srand(time(0));for(i=0;i<n;i++)input[i]=rand();input[i]='\0';}int a[1000000];int main(){int max=a[0],min=a[0];int i,j,n;cout<<"请输入数据规模:"<<endl;for(j=0;j<5;j++){cin>>n;ran(a,n);clock_t start,end,over; //计算程序运行时间的算法start=clock();end=clock();over=end-start;start=clock();for(i=1;i<n;i++){if(a[i]>max)max=a[i];if(a[i]<min)min=a[i];}cout<<max<<" "<<min<<endl;end=clock();printf("The time is %6.3f",(double)(end-start-over)/CLK_TCK); //显示运行时间}system("pause");return 0;}。

最大最小问题的分治算法

最大最小问题的分治算法

最大最小问题的分治算法分治算法是一种解决问题的算法策略,它通过将问题分成更小的子问题,递归地解决这些子问题,最终将子问题的解合并起来得到原问题的解。

分治算法在计算机科学中有着广泛的应用,其中最大最小问题是一种非常经典的问题,也可以通过分治算法来解决。

最大最小问题是指在一个给定的数组中找出最大值和最小值。

这个问题的解决方法有很多种,比如暴力搜索,排序后取首尾元素等。

然而,使用分治算法可以更加高效地解决这个问题。

分治算法的思想是将原问题分解成更小的子问题,然后递归地解决这些子问题,最后将子问题的解合并起来得到原问题的解。

在最大最小问题中,我们可以将原数组分成两个部分,然后分别求出左右子数组的最大值和最小值,最后将结果合并起来得到整个数组的最大值和最小值。

具体来说,我们可以采用以下的分治算法来解决最大最小问题:1.首先将原数组分成两个部分,分别为左子数组和右子数组。

2.递归地求解左子数组和右子数组的最大值和最小值。

3.将左子数组和右子数组的最大值和最小值合并起来得到整个数组的最大值和最小值。

在实现上述分治算法时,我们需要注意以下几点:1.基本情况的处理:当数组中只有一个元素时,最大值和最小值都是这个元素本身。

2.如何将问题分解成更小的子问题:我们可以将数组均匀地分成两个部分,然后分别求解左右子数组的最大值和最小值。

3.如何将子问题的解合并起来:我们可以通过比较左右子数组的最大值和最小值,然后得到整个数组的最大值和最小值。

分治算法在解决最大最小问题时的时间复杂度为O(n),其中n为数组的长度。

这是因为在每一层递归中,我们需要对数组进行一次分割和一次合并操作,而对一个包含n个元素的数组进行分割和合并的时间复杂度均为O(n)。

总的来说,分治算法是一种非常高效的解决问题的方法,它将原问题分解成更小的子问题,然后递归地解决这些子问题,最后将子问题的解合并起来得到原问题的解。

在解决最大最小问题时,分治算法可以通过将数组分成两个部分,然后分别求解左右子数组的最大值和最小值,最后将结果合并起来来得到整个数组的最大值和最小值,时间复杂度为O(n)。

最大值最小值

最大值最小值

// 直接算法求最小值
public static int getMinValue(int[] array) { int Min = 0; for (int i = 0; i < (array.length - 1); i++) { if (array[i] == array[i + 1]) { Min = array[i + 1]; } else if (array[i] < array[i + 1]) { Min = array[i]; array[i] = array[i + 1]; array[i + 1] = Min; } else if (array[i] > array[i + 1]) { Min = array[i + 1]; } } return Min; }

谢谢
} else { int mid = (l + r) / 2; int[] preHalf = minMax(arr, l, mid); int[] postHalf = minMax(arr, mid + 1, r); min = preHalf[0] < postHalf[0] ? preHalf[0] : postHalf[0]; max = preHalf[1] > postHalf[1] ? preHalf[1] : postHalf[1]; } return new int[] { min, max }; } } 假设数组的大小为8,用直接的算法,最大值最小值总需要 比较14次,而用分治算法可以一次性求出最大和最小,只需 要10次比较。
分治法求最大值,最小值
目录
1 2
分治法的基本思想 最大值,最小值实例

分治法求最大值和最小值

分治法求最大值和最小值

实验报告一、实验名称:分治法求最大值和最小值二、实验学时:4三、实验器材和环境:PC机一台四、实验内容和目的:1、实验目的:加深对分治算法原理及实现过程的理解。

2、实验任务:实现用分治算法解决问题。

3、实验内容:给定一个顺序表,编写一个求出其最大值和最小值的分治算法。

分析:由于顺序表的结构没有给出,作为演示分治法这里从简顺序表取一整形数组数组大小由用户定义,数据随机生成。

我们知道如果数组大小为 1 则可以直接给出结果,如果大小为 2则一次比较即可得出结果,于是我们找到求解该问题的子问题即: 数组大小 <= 2。

到此我们就可以进行分治运算了,只要求解的问题数组长度比 2 大就继续分治,否则求解子问题的解并更新全局解以下是代码。

五、实验原理:分治算法基本原理,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。

大概分为“分治合“策略:分:将要求解的较大规模的问题分割成K个更小规模的子问题;治:对这K个子问题分别求解。

如果子问题的规模仍然不够小则再划分为K个子问题,如此递归的进行下去;划分到基础问题,则设计可行算法直接求解;合:将求出的小规模的问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解。

一个分治法将规模为n的问题分成k个规模为n/m的子问题去解。

设分解阀值n0=1,且adhoc解规模为1的问题耗费1个单位时间。

再设将原问题分解为k个子问题以及用merge将k个子问题的解合并为原问题的解需用f(n)个单位时间。

用T(n)表示该分治法解规模为|P|=n的问题所需的计算时间,则有:11)()/()1()(>=⎩⎨⎧+=n n n f m n kT O n T通过迭代法求得方程的解:∑-=+=1log0log )/()(n m j jj k m m n f k n n T 六、实验步骤:1、设定参数: s 为当前分治段的开始下标,e 为当前分治段的结束下标,meter 表的地址,max 为存储当前搜索到的最大值,min 为存储当前搜索到的最小值2、获取局部解,并更新全局解,不是子问题的话就继续分治3、用一组随机数据填充数组并以表的形式输出4、用分治法获取最大值和最小值七、实验数据及结果分析:分治算法代码:#include <stdio.h>#include <stdlib.h>#include <limits.h>#include <time.h>#define M 40// 分治法获取最优解void PartionGet(int s,int e,int *meter,int *max,int *min){int i;if(e-s <= 1){// 获取局部解,并更新全局解if(meter[s] > meter[e]){if(meter[s] > *max)*max = meter[s];if(meter[e] < *min)*min = meter[e];}else{if(meter[e] > *max)*max = meter[s];if(meter[s] < *min)*min = meter[s];}return ;}i = s + (e-s)/2; // 不是子问题继续分治PartionGet(s,i,meter,max,min);PartionGet(i+1,e,meter,max,min);}int main(){int i,meter[M];int max = INT_MIN; // 用最小值初始化int min = INT_MAX; // 用最大值初始化printf("The array's element as followed:\n\n"); srand(time(0)); // 初始化随机数发生器for(i = 0; i < M; i ++){ // 随机数据填充数组meter[i] = rand()%10000;if(!((i+1)%10)) // 输出表的随机数据printf("%-6d\n",meter[i]);elseprintf("%-6d",meter[i]);}PartionGet(0,M - 1,meter,&max,&min); // 分治法获取最值printf("\nMax : %d\nMin : %d\n",max,min);system("pause");return 0;}实验结果:。

用分治法求n个数中的最大值、次大值、最小值、次小值

用分治法求n个数中的最大值、次大值、最小值、次小值

#include<iostream.h>int a[100];void maxmin(int i,int j,int *max1,int *min1,int *max2,int *min2){int max,min,minmax,minmin;if(i==j){*max1=*min1=*min2=*max2=a[i];}else{if(i==j-1){if(a[i]<a[j]){*max1=*min2=a[j];//当只有2个元素时,最大值=次小值*min1=*max2=a[i];//当只有2个元素时,最小值=次大值}else{*max1=*min2=a[i];//当只有2个元素时,最大值=次小值*min1=*max2=a[j];//当只有2个元素时,最小值=次大值}}else{int m=(i+j)/2;maxmin(i,m,max1,min1,max2,min2);//求分割后前半部分的最大值,次大值,最小值,次小值maxmin(m+1,j,&max,&min,&minmax,&minmin);//求分割后后半部分的最大值,次大值,最小值,次小值if(*max1<max)//当前半部分的最大值小于后半部分最大值时{*max2=*max1;//将前半部分的最大值赋给次大值*max1=max;//将后半部分的最大值赋给前半部分最大值,担任最大值if(max!=minmax)//{if(*max2<minmax)//当前半部分的次大值小于后半部分的次大值时,将后半部分的次大值赋给前半部分的次大值{*max2=minmax;}}}else//当前半部分的最大值大于后半部分最大值时{if(*max2<max)//当前半部分的次大值小于后半部分最大值时,则整组数据中次大值为后半部分最大值{*max2=max;}}//当求整组数据的最小与次小值时,算法同上述大致相同if(*min1>min){*min2=*min1;*min1=min;if(min!=minmin)if(*min2>minmin){*min2=minmin;}}else{if(*min2>min){*min2=min;}}}}}int main(){int n,i,m,max[2],min[2];cin>>n;for(i=0;i<n;i++){cin>>m;a[i]=m;}maxmin(0,n-1,&max[0],&min[0],&max[1],&min[1]);cout<<max[0]<<" "<<max[1]<<endl;cout<<min[0]<<" "<<min[1]<<endl;return 0;}。

快速求数组最大值的方法

快速求数组最大值的方法

快速求数组最大值的方法要快速求数组的最大值,我们可以使用不同的方法和算法。

下面将介绍几种常见的方法。

1.简单线性:这是最直观的方法,通过遍历数组找到最大值。

我们可以使用一个变量来保存当前的最大值,并在遍历过程中不断更新该变量。

这个方法的时间复杂度为O(n),其中n为数组的大小。

```pythondef find_max(arr):max_value = arr[0]for i in range(1, len(arr)):if arr[i] > max_value:max_value = arr[i]return max_value```2. 分治法:将数组分割成更小的子问题,并且在解决子问题时,使用递归来获取子问题的解,最后再将子问题的解合并成整个问题的解。

对于找到数组的最大值,可以将数组分成两半,分别找到左半部分的最大值和右半部分的最大值,然后比较两个最大值得出结果。

这个方法的时间复杂度为O(nlog(n))。

```pythondef find_max(arr):if len(arr) == 1:return arr[0]mid = len(arr) // 2left_max = find_max(arr[:mid])right_max = find_max(arr[mid:])return max(left_max, right_max)```3.动态规划:将问题分解为相互重叠的子问题,通过存储中间解来加快计算速度。

对于找到数组的最大值,我们可以使用动态规划来记录每个位置的最大值。

我们从数组的第一个元素开始,将当前元素与前一个元素的最大值相加,然后将结果与当前元素比较取较大值,最后得到整个数组的最大值。

这个方法的时间复杂度为O(n)。

```pythondef find_max(arr):max_value = arr[0]for i in range(1, len(arr)):arr[i] = max(arr[i], arr[i] + arr[i-1])max_value = max(max_value, arr[i])return max_value```以上是几种常见的方法来快速求数组的最大值。

查找数组元素的最大值和最小值、众数问题

查找数组元素的最大值和最小值、众数问题

《算法设计与分析》上机实验报告专业班级学号学生姓名完成日期1. 上机题目及实验环境1.1上机题目:1.1.1 用分治法查找数组元素的最大值和最小值1.1.2 众数问题1.2实验环境:CPU:Intel Core i3 2.30GHz内存:2.0G操作系统:Windows 7软件平台:Visual C++2. 算法设计与分析2.1 查找数组最值2.1.1 分治递归方法:●将max和min设置为静态全局变量;●将数据集array平均分为两个数据集;●分别求解两个数据集中的最大和最小值;●最终的最大和最小值通过与max和min的值比较;●采用同样的处理方法递归处理以分好的数据集。

2.1.2 细节处理:●数组的大小为n2,n=0,1,2,3......●数组中的数字随机产生,数字的范围为1~100;●静态全局变量:max的初值为0,min的初值为101。

2.2 众数问题2.2.1 快速排序算法:●设置两个变量i、j,排序开始的时候:i=left,j=right+1;●以第一个数组元素作为关键数据,赋值给temp,即temp=array[left];●从j开始向前搜索,即由后开始向前搜索(--j),找到第一个小于temp的值array[j];●从i开始向后搜索,即由前开始向后搜索(++i),找到第一个大于temp的array[i];●交换array[i]和array[j]的值;●重复搜索步骤,直到i=j;●将temp的值和array[j]的值交换,并以此为界,分别在对左右两边进行快速排序。

3. 核心代码3.1 查找最值3.1.1 流程图(如图1)(核心函数为void MaxAndMin(int array[N], int left, int right)):图1.查找最值的流程图3.1.2 核心代码如下:(注:max和min是静态全局变量)void MaxAndMin(int array[N], int left, int right) // 求最大值最小值函数,分治递归法{int mid; // 数组的分界点if ( (left + 1) == right) // 分治的数组只有两个值时,更新max和min的值{if ( array[left] < array[right] && max < array[right] ) // 判断、更新最大值max = array[right];if ( array[left] > array[right] && max < array[left] )max = array[left];if ( array[left] < array[right] && min > array[left]) // 判断、更新最小值min = array[left];if ( array[left] > array[right] && min > array[right])min = array[right];}else{mid = (left + right) / 2; // 对数组进行分治MaxAndMin(array, left, mid); // 对左边的数组进行分治递归MaxAndMin(array, mid + 1, right); // 对右边的数组进行分治递归}}3.2 众数问题3.2.1 流程图(如图图2.众数问题的流程图3.2.2 核心代码如下:void quickSort(int *array,int left,int right) // 用快速排序法排序数组{if(left < right){int i = left, j = right+1;int temp = array[left]; // 以第一个数为基准while(true){while(array[++i] < temp && i < right); // 从前面找大于基准的数while(array[--j] > temp); // 从后面找小于基准的数if(i >= j) // 当left>right时停止break;swap(array[i], array[j]); // 交换两值}array[left] = array[j];array[j] = temp;int part = j; // 以靠左的较小值为界,对左右两部分数继续快排quickSort(array, left, part-1);quickSort(array, part+1, right);}}4. 运行与调试4.1 查找数组最值产生随机数组并排序:(如图3、图4、图5)图3.随机数组之一及结果图4.随机数组之二及结果图5.随机数组之三及结果4.2 众数问题4.2.1 只有一个众数(如图6、图7)图6.只有一个众数的数组图7.只有一个众数的结果4.2.2 没有众数(如图8、图9)图8.没有众数的数组图9.没有众数的结果4.2.3 有两个众数(如图10、图11)图10.有两个众数的数组图11.有两个众数的结果5. 结果分析和小结5.1 结果分析:通过设置不同的测试数据及运行的结果,可以看出程序的算法思想是正确的,程序的运行也是有效的,全面的。

分治算法找最大最小值和k值

分治算法找最大最小值和k值

实验报告填写内容时,可把表格扩大。

实验的源程序代码(要有注释)附在表后。

#include "stdio.h"#define N 100void maxmin2(int A[],int i,int j,int *max,int *min){int mid,max1,max2,min1,min2;if (j==i){ *max= *min=A[i]=A[j];return;}if(j-1==i){if(A[i]>A[j]){*max=A[i];*min=A[j];}else{*max=A[j];*min=A[i];}return;}mid=(i+j)/2;maxmin2( A, mid+1, j,&max2,&min2);maxmin2( A, i,mid,&max1,&min1);if(max1>max2)*max=max1;else*max=max2;if(min1>min2)*min=min2;else*min=min1;}main(){int i,n;int A[N];int max,min;printf("请输入要比较的数据的个数:");scanf("%d",&n);for(i=0;i<n;i++){printf("请输入第%d个数",i+1);scanf("%d",&A[i]);}maxmin2(A,0,n-1,&max,&min);printf("最大值为:%d 最小值为:%d",max,min);}222222#include"stdio.h"#define N 100int seek(int a[],int m,int n,int num){int i,j,k,flag,result;k=num;for(i=m;i<n;i++){if(i<k){if(a[i]>a[k]){ //对k前面的数值排序flag=a[i];a[i]=a[k];a[k]=flag;k=i;}}if(i>k){if(a[i]<a[k]){ //如果i对应的值比k的小,则元素后移,把a[i]移到a[k]之前flag=a[i];for(j=i;j>0;j--)a[j]=a[j-1];a[0]=flag;k++;}}}if(k==num)return result=a[k];if(num>k)return result=seek(a,k+1,n,num);if(num<k)return result=seek(a,0,k,num);}main(){int i,n,num,result;int a[N];printf("请输入要比较的数据的个数:");scanf("%d",&n);for(i=0;i<n;i++){printf("请输入第%d个数",i+1);scanf("%d",&a[i]);}printf("请输入要查找的第k小的数:");scanf("%d",&num);result=seek(a,0,n,num-1); //num-1,数组从0开始标记printf("查找的结果为%d ",result);}。

分治算法求最大值与最小值

分治算法求最大值与最小值

实践题目:给定一个顺序表,编写一个求出其最大值和最小值的分治算法。

分析:由于顺序表的结构没有给出,作为演示分治法这里从简顺序表取一整形数组数组大小由用户定义,数据随机生成。

我们知道如果数组大小为 1 则可以直接给出结果,如果大小为 2则一次比较即可得出结果,于是我们找到求解该问题的子问题即: 数组大小 <= 2。

到此我们就可以进行分治运算了,只要求解的问题数组长度比 2 大就继续分治,否则求解子问题的解并更新全局解以下是代码。

*//*** 编译环境TC ***/#include <stdio.h>#include <stdlib.h>#include <limits.h>#define M 40/* 分治法获取最优解 */void PartionGet(int s,int e,int *meter,int *max,int *min){/* 参数:* s 当前分治段的开始下标* e 当前分治段的结束下标* meter 表的地址* max 存储当前搜索到的最大值* min 存储当前搜索到的最小值*/int i;if(e-s <= 1){ /* 获取局部解,并更新全局解 */if(meter[s] > meter[e]){if(meter[s] > *max)*max = meter[s];if(meter[e] < *min)*min = meter[e];}else{if(meter[e] > *max)*max = meter[s];if(meter[s] < *min)*min = meter[s];}return ;}i = s + (e-s)/2; /* 不是子问题继续分治,这里使用了二分,也可以是其它 */ PartionGet(s,i,meter,max,min);PartionGet(i+1,e,meter,max,min);}int main(){int i,meter[M];int max = INT_MIN; /* 用最小值初始化 */int min = INT_MAX; /* 用最大值初始化 */printf("The array's element as followed:\n\n");randomize(); /* 初始化随机数发生器 */for(i = 0; i < M; i ++){ /* 随机数据填充数组 */meter[i] = rand()%10000;if(!((i+1)%10)) /* 输出表的随机数据 */printf("%-6d\n",meter[i]);elseprintf("%-6d",meter[i]);}PartionGet(0,M - 1,meter,&max,&min); /* 分治法获取最值 */ printf("\nMax : %d\nMin : %d\n",max,min);system("pause");return 0;}。

找出一组数中的最大值

找出一组数中的最大值

找出一组数中的最大值在数学和统计学中,我们经常需要在一组数字中找到最大值。

最大值代表了这组数中的最大数值,它具有重要的参考价值。

本文将介绍几种常见的方法,以及它们在寻找最大值过程中的应用。

一、顺序比较法顺序比较法是一种简单直观的方法,适用于小规模的数值比较。

它的原理是从第一个数开始,逐个与后面的数进行比较,如果找到比当前最大值还大的数,则更新最大值,直至遍历完整个数列。

这种方法非常容易实现,但对于大规模数据的效率较低。

二、分治法分治法将问题拆分成若干个子问题,通过递归的方式解决。

在寻找最大值的过程中,可以将数列拆分成更小的部分,然后分别找出每个部分的最大值,最终比较得出全局最大值。

此方法适用于规模较大的数列,能够提高寻找效率。

三、排序法排序法是将一组数按照大小排序的方法。

通过将数列进行排序,最大值将位于数列的末尾。

我们可以选择合适的排序算法,如冒泡排序、快速排序等,将数列进行排序,然后直接取末尾的数作为最大值。

排序法在寻找最大值的同时也可以得到整个数列的有序排列,可应用于更多的问题。

四、动态规划法动态规划法(Dynamic Programming)是一种将复杂问题分解成更简单子问题的方法。

在寻找最大值的过程中,我们可以定义一个状态表,记录下每个位置的最大值,并逐步迭代求解出整个数列的最大值。

动态规划法在处理连续数列的最大值问题上具有较高的效率。

五、数学分析法数学分析法通过对数列的特征和性质进行分析,找出其中的规律,并运用数学方法求解最大值。

例如,如果数列是等差数列,则最大值位于数列的末尾;如果数列是等比数列,则最大值位于数列的起点或终点。

通过分析数列的特点,我们可以得到最大值的位置,从而更高效地找到最大值。

综上所述,寻找一组数中的最大值可以应用不同的方法,如顺序比较法、分治法、排序法、动态规划法和数学分析法等。

在实际应用中,需要根据具体问题的规模和特点选择合适的方法。

无论采用哪种方法,寻找最大值都是一项重要的任务,它对于数学、统计学和实际问题的解决具有重要的意义。

分治策略在求最大最小数中的应用与分析

分治策略在求最大最小数中的应用与分析

分治策略在求最大最小数中的应用与分析提要:排序(Sorting)是计算机程序设计中的一个重要操作,它的功能是将一个数据记录的任意序列,重新排列成一个按关键字有序的序列,在实现的过程中,可以有多种方法,其中利用分治策略是解决这一问题的有效途径。

本文通过比较讨论了运用分治策略的思想实现快速求解,证明其有效性和高效性。

关键词:分置策略;应用;分析1前言任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。

问题的规模越小,越容易直接求解,解题所需的计算时间也越少。

例如,对于n个元素的排序问题,当n=1时,不需任何计算。

n=2时,只要作一次比较即可排好序。

n=3时只要作3次比较即可,…。

而当n较大时,问题就不那么容易处理了。

要想直接解决一个规模较大的问题,有时是相当困难的。

2分治策略的应用与分析分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。

分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。

这种算法设计策略叫做分治法。

分治法在每一层递归上都有三个步骤:①分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;②解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题;③合并:将各个子问题的解合并为原问题的解。

我们以线性表查找为例,例:在线性表L中找出最大数{1,5,13,6,8,9,215,3}(1)、用常规查找法,就是一个一个的扫描L的所有元素,找出最大数和最小数。

int maxmin(int a[]){int max1=a[0],min1=a[0];for(i=1;ia[i])max1=a[i];if (max1void maxmin(int i,int j,int a[]);int max,min; //全局变量void main(){int a[]={1,5,13,6,8,9,215,3,66,8};max=a[0];min=a[0];maxmin(0, sizeof(a)/sizeof(a[0])-1,a);cout1)//子集大于二时候,分集{maxmin(i,int((j+i)/2),a);maxmin(int((j+i)/2)+1,j,a);}else{if (a[i]>a[j]){if (maxa[j]) min=a[j];}else{if (maxa[i]) min=a[i];}}}分析:我们可以把10个元素分成A1={1,5,13,6}和A2={8,9,215,3}两组,分别求出两组的最大最小值,然后比较这两组的最大最小值,求出全部元素的最大值。

算法设计与分析——分治法求最大值和最小值

算法设计与分析——分治法求最大值和最小值

算法设计与分析——分治法求最⼤值和最⼩值D e scr i p t i on给定n个数,在最坏情况下⽤ 3n/2-2 次⽐较找出这n个数中元素的最⼤值和最⼩值。

要求只编写函数 void maxmin(int a[],int low,int high,int*max,int*min).系统会⾃动在程序的最后加上如下代码:int main(){int max,min,k,a[200];int m;while(scanf("%d",&k)&&k){for(m=0;m<k;m++)scanf("%d",&a[m]);maxmin(a,0,k-1,&max,&min);printf("%d %d\n",max,min);}}I n p u t包含多组测试数据。

每组测试数据的第⼀个元素是整数的个数n,接下来是n个整数。

0表⽰结束。

n<=200Ou t p u t这n个数中的最⼤值和最⼩值。

S a m p le I n p u t5 1 8 2 4 33 24 1S a m p le Ou t p u t8 14 1如果之前遍历⼀遍需要⽐较n-1次,才能得到数组中的最⼤值和最⼩值,这显然是不符合预期要求的,这⾥应该采⽤的是分治思想。

分治法主要有三个步骤:1.分解:将原问题划分为规模较⼩的⼏个⼦问题。

2.求解:⼦问题⼩到可以求解了,就去求解。

3.合并:将⼦问题的解合并为原问题的解。

对于本问题就是不断地进⾏⼆分,直到分解为不可分的⼀个数组元素,这个数组元素是最⼩⼦问题的最⼤值也是最⼩值,之后再逐⼀合并为#include<cstdio>#include<algorithm>#define inf 0x3f3f3f3fusing namespace std;void maxmin(int*a,int left,int right,int*max,int*min){int mid;int lmax=0,lmin=inf,rmax=0,rmin=inf;if(left==right){*max=a[left];*min=a[right];return;}mid=(left+right)/2;maxmin(a,left,mid,&lmax,&lmin);maxmin(a,mid+1,right,&rmax,&rmin);if(lmax>rmax){*max=lmax;}else{*max=rmax;}if(lmin<rmin){*min=lmin;}else{*min=rmin;}return;}int main(){int max,min,k,a[200];int m;while(scanf("%d",&k)&&k){for(m=0; m<k; m++)scanf("%d",&a[m]);maxmin(a,0,k-1,&max,&min);printf("%d %d\n",max,min);}}使⽤分治法解决了本问题,但是3n/2-2 次⽐较是怎么计算得到的呢?我们来分析⼀下本算法:void maxmin(int*a,int left,int right,int*max,int*min){int mid;int lmax=0,lmin=inf,rmax=0,rmin=inf;if(left==right){*max=a[left];*min=a[right];return;}//------------------------------------------------>O(1)mid=(left+right)/2;//------------------------------->O(1)maxmin(a,left,mid,&lmax,&lmin);//------------------->T(n/2)maxmin(a,mid+1,right,&rmax,&rmin);//---------------->T(n/2)if(lmax>rmax){*max=lmax;}else{*max=rmax;}if(lmin<rmin){*min=lmin;}else{*min=rmin;}return;//------------------------------------------>O(1)}可以得到算法的递推表达式,进⽽求解。

用分治法查找数组元素的最大值和最小值(python)

用分治法查找数组元素的最大值和最小值(python)

学号: 20162601047 姓名:苏文江专业年级班级:软件1604班实验室:工训中心311 实验日期:2018/5/5课程名称计算机算法实验课时实验项目名称和序号分治算法实验(用分治法查找数组元素的最大值和最小值)同组者姓名实验目的通过上机实验,掌握分治算法的问题描述、算法设计思想、程序设计。

同时,加深我们对分治算法的理解。

实验环境Python 3.6Pycharm实验内容和原理1.实验内容:在满足分治法的条件下,根据不同的输入用例,能准确的输出用例中的最大值与最小值。

并计算出程序运行所需要的时间。

2.实验原理:用分治法查找数组元素的最大值和最小值。

实验步骤方法关键代码1.实验步骤①先解决小规模的问题,如数组中只有1 个元素或者只有两个元素时候的情况。

②将问题分解,如果数组的元素大于等于3 个,将数组分为两个小的数组。

③递归的解各子问题,将中分解的两个小的数组再进行以上两个步骤最后都化为小规模问题。

④将各子问题的解进行比较最终得到原问题的解。

2.实验方法:以递归的方式对分治后的各个部分的结果进行处理,即把各部分的最大值比较得到较大部分的最大值,依次最终得到完整array的最大值。

3.关键代码def Merge_Max(left,right):global array #需要求最大值的数组if(len(array) <= 0): #若数组为空,返回return 0if(right-left <= 1): #已分解至最小单元,取最大值if(array[left] >= array[right]):max = array[left]else:max = array[right]else: #继续分解middle = (left+right)//2max1 = Merge_Max(left,middle)max2 = Merge_Max(middle+1,right)if(max1 > max2): #从分解的子数组中取最大值max = max1else:max = max2return max求最小值原理同求最大值。

python使用分治法实现求解最大值的方法

python使用分治法实现求解最大值的方法

python使⽤分治法实现求解最⼤值的⽅法本⽂实例讲述了python使⽤分治法实现求解最⼤值的⽅法。

分享给⼤家供⼤家参考。

具体分析如下:题⽬:给定⼀个顺序表,编写⼀个求出其最⼤值和最⼩值的分治算法。

分析:由于顺序表的结构没有给出,作为演⽰分治法这⾥从简顺序表取⼀整形数组数组⼤⼩由⽤户定义,数据随机⽣成。

我们知道如果数组⼤⼩为 1 则可以直接给出结果,如果⼤⼩为 2则⼀次⽐较即可得出结果,于是我们找到求解该问题的⼦问题即: 数组⼤⼩ <= 2。

到此我们就可以进⾏分治运算了,只要求解的问题数组长度⽐ 2 ⼤就继续分治,否则求解⼦问题的解并更新全局解以下是代码。

题⽬看懂了就好说了,关键是要把顺序表分解成为k个元素为2的列表,然后找列表的最⼤值,然后把⼦问题的列表进⾏合并,再递归求解。

上代码吧:#-*- coding:utf-8 -*-#分治法求解最⼤值问题import random#求解两个元素的列表的最⼤值⽅法def max_value(max_list):return max(max_list)#定义求解的递归⽅法def solve(init_list):if len(init_list) <= 2:#若列表元素个数⼩于等于2,则输出结果print max_value(init_list)else:init_list=[init_list[i:i+2] for i in range(0,len(init_list),2)]#将列表分解为列表长度除以2个列表max_init_list = []#⽤于合并求最⼤值的列表for _list in init_list:#将各各个⼦问题的求解列表合并max_init_list.append(max_value(_list))solve(max_init_list)if __name__ == "__main__":test_list = [12,2,23,45,67,3,2,4,45,63,24,23]#测试列表solve(test_list)希望本⽂所述对⼤家的Python程序设计有所帮助。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

*/
/*** 编译环境TC ***/
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define M 40
/* 分治法获取最优解 */
void PartionGet(int s,int e,int *meter,int *max,int *min){
*max = meter[s];
if(meter[s] < *min)
*min = meter[s];
}
return ;
}
i = s + (e-s)/2; /* 不是子问题继续分治,这里使用了二分,也可以是其它 */
PartionGet(s,i,meter,max,min);
PartionGet(i+1,e,meter,max,min);
}
int main(){
int i,meter[M];
int max = INT_MIN; /* 用最小值初始化 */
if(meter[s] > meter[e]){
if(meter[s] > *max)
*max = meter[s];
if(meter[e] < *min)
*min = meter[e];
}
else{
if(meter[e] > *max)
/* 参数:
* s 当前分治段的开始下标
* e 当前分治段的结束下标
* meter 表的地址
* max 存储当前搜索到的最大值
* min 存储当前搜索到的最小值
*/
int i;
if(e-s <= 1){ /* 获取局部解,并更新全局解 */
meter[i] = rand()%10000;
if(!((i+1)%10)) /* 输出表的随机数据 */
printf("%-6d\n",meter[i]);
else
printf("%-6d",meter[i]);
}
PartionGet(0,M - 1,meter,&max,&min); /* 分治法获取最值 */
int min = INT_MAX; /* 用最大值初始化 */
printf("The array's element as followed:\n\n");
randomize(); /* 初始化随机数发生器 */
for(i = 0; i < M; i ++){ /* 随机数据填充数组 */
给定一个顺序表,编写一个求出其最大值和最小值的分治算法。
分析:
由于顺序表的结构没有给出,作为演示分治法这里从简顺序表取一整形数组数组大小由用户定义,数据随机生成。我们知道如果数组大小为 1 则可以直接给出结果,如果大小为 2则一次比较即可得出结果,于是我们找到求解该问题的子问题即: 数组大小 <= 2。到此我们就可以进行分治运算了,只要求解的问题数组长度比 2 大就继续分治,否则求解子问题的解并更新全局解以下是代码。
prax,min);
system("pause");
return 0;
}
相关文档
最新文档