关于求数组的最大值和最小值问题(C代码)
2013-05-13 17:56
381 查看
给定一个数组求该数组的最大值最小值,例如 int arr[11] = {1,2,6,2,18,54,12,-2,3,23,13}; 最大值是54,最小值是-2
第一种方式:也是复杂度最高的算法,是遍历数组先找出最大值,然后同理再找出最小值。这种算法的复杂度最高需要2N次遍历和比较。
第二种方式:
可以采用两两分组的模式进行比较,让其中较小的元素与最小值进行比较,确定临时的最小值,同理让较大的元素与最大值进行比较,确定最大值。这样一次步进为2的遍历就能够确定最大最小值。代码如下:
第三种方式:可以采用分治算法完成上最大值与最小值的求解,使用递归的形式完成分治算法的求解,首先是结束条件:当子数组中含有一个元素最大最小值相等,或当子数组中含有两个元素直接可以确定最大最小值。其他情况下确定中间元素分别求左半部分和右半部分的最大最小值,最后将左右两部分的最大最小值进行综合确定最大值和最小值,代码如下:
第一种方式:也是复杂度最高的算法,是遍历数组先找出最大值,然后同理再找出最小值。这种算法的复杂度最高需要2N次遍历和比较。
第二种方式:
可以采用两两分组的模式进行比较,让其中较小的元素与最小值进行比较,确定临时的最小值,同理让较大的元素与最大值进行比较,确定最大值。这样一次步进为2的遍历就能够确定最大最小值。代码如下:
void maxandmin(int arr[], int n, int *max, int *min){ int i; for(i = 0; i < n; i+=2){ if(i <= n - 2){ if(arr[i +1] < arr[i]){ if(*max < arr[i]) *max = arr[i]; if(*min > arr[i +1]) *min = arr[i +1]; }else{ if(*max < arr[i + 1]) *max = arr[i + 1]; if(*min > arr[i]) *min = arr[i]; } }else{ if(*max < arr[i -1]) *max = arr[i]; if(*min > arr[i -1]) *min = arr[i +1]; } } }
第三种方式:可以采用分治算法完成上最大值与最小值的求解,使用递归的形式完成分治算法的求解,首先是结束条件:当子数组中含有一个元素最大最小值相等,或当子数组中含有两个元素直接可以确定最大最小值。其他情况下确定中间元素分别求左半部分和右半部分的最大最小值,最后将左右两部分的最大最小值进行综合确定最大值和最小值,代码如下:
void maxandmin(int arr[], int l, int r, int *max, int *min){ if(r == l){ *max = *min = arr[l]; }else if(r - l == 1){ if(arr[l] > arr[r]){ *max = arr[l]; *min = arr[r]; }else{ *max = arr[r]; *min = arr[l]; } }else{ int mid = (r + l) / 2; int lmax,lmin,rmax,rmin; maxandmin(arr, l, mid , &lmax, &lmin); maxandmin(arr, mid + 1, r , &rmax, &rmin); *max = lmax > rmax ? lmax : rmax; *min = lmin < rmin ? lmin : rmin; } }
相关文章推荐
- 关于用Java来写最大公约数和最小公倍数的问题详解及代码
- java代码数组求平均值,最大值,最小值
- 最大子数组问题-c++代码实现及运行实例结果
- 编程之美4:那些常被考到的关于数组的最大子数组问题
- 最大子数组问题-暴力求解-c++代码实现及运行实例结果
- 关于定义一个二维int数组,编写代码获取最小元素
- Java常识求阶层!的和 ,获取某个数组中的最小值,定义数组,获得成绩之和,平均成绩,最小成绩,最大成绩。等问题大全
- 最大子数组问题-c++代码实现及运行实例结果
- 最大子数组问题-暴力求解-c++代码实现及运行实例结果
- JAVA代码—算法基础:子数组的最大累加和问题
- 在数组中限制次数的取最大值和最小值问题
- 最大子数组问题-c++代码实现及运行实例结果
- 最大子数组问题-暴力求解-c++代码实现及运行实例结果
- 关于数组TOP K算法(快排及最小堆方式C代码)
- 最大子数组问题的递归和非递归(线性时间)代码
- 【软件工程】代码复审与子数组最大和线性算法寻找问题
- 最大子数组问题-c++代码实现及运行实例结果
- 最大子数组问题-暴力求解-c++代码实现及运行实例结果
- 关于二分图的最大匹配(最小点覆盖)问题的资料整理
- 如何求出数组中最小(或者最大)的k个数(least k问题)