您的位置:首页 > 编程语言

关于求数组的最大值和最小值问题(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的遍历就能够确定最大最小值。代码如下:

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: