现在的位置: 首页 > 编程语言 > 正文

关于求数组的最大值和最小值问题(C代码)

2018年11月06日 编程语言 ⁄ 共 1013字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.