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