给定一个数组求该数组的最大值最小值,例如 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;
}
}